码迷,mamicode.com
首页 > 编程语言 > 详细

LeetCode的medium题集合(C++实现)十二

时间:2015-05-24 13:00:28      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:c++   leetcode   牛顿迭代法   二分法   

1 Sqrt(x)
Implement int sqrt(int x).Compute and return the square root of x.
因为这里都是整数,可以直接采用二分法求解

int mySqrt(int x) {
       if (x <= 1) return x;
    int begin = 1, end =x, mid = 0;
    while (begin<=end)
    {
        mid = (begin + end) / 2;
        if (mid<x / mid) //不要用乘法判断,否则会越界
        {
            begin = mid + 1;
        }
        else if (mid>x / mid)
        {
            end = mid - 1;
        }
        else if (mid == x / mid)
            return mid;
    }
    return end;
    }

牛顿迭代法:设r是f(x)=0的根,选取x0作为r的初始近似值,过点(x0,f(x0))做曲线f(x)=y的切线L,L的方程为y=f(x0)(x?x0)+f(x0),求出L与x轴交点的横坐标x1=x0?f(x0)f(x0),称x1为r的一次近似值。过点(x1,f(x1))做曲线的切线,并求该切线与x轴交点的横坐标,称为r的二次近似值。重复以上过程,得r的近似值序列xn+1=xn?f(xn)f(xn),其中,称为r的n+1次近似值,上式称为牛顿迭代公式。
当第n+1次与第n次近似值的差相差几乎为0时,即得到方程的解。
这里记f(x)=x2?X,求导得f(x)=2x,代入上述迭代公式得到xn+1=xn/2+X/(2xn)

int mySqrt(int x) {
       if (x == 0)
        return 0;
    double last;
    double res = 1;
    do
    {
        last = res;
        res = x / (2 * last) + last / 2.0;
    } while (abs(res - last) > 0.001);
    return int(res);
    }

2 Simplify Path
Given an absolute path for a file (Unix-style), simplify it.
用一个vector容器保存目录,当有多个’/’出现时去掉重复的,当出现’..’时是返回上一个目录,如果容器大小不为0,要去掉容器末尾的元素。

string simplifyPath(string path) {
        vector<string> res;
        int len=path.length();
        string mid;
        int start=0;
        while(start<len)
        {
            while(path[start]==‘/‘&&start<len) 
                start++;  //去掉重复‘/‘
            while(path[start]!=‘/‘&&start<len)
            {
               //记录下每一级目录
                mid+=path[start];
                start++;
            }
            if(mid=="."||mid=="") 
            {
                mid.clear(); //进入下一次循环前,记得清空mid
                continue;
            }
            if(mid=="..")
            {
                if(res.size()>0)
                   res.pop_back();
                mid.clear(); 
                continue;
            }
            res.push_back(mid);
            mid.clear();
        }
        string result;
        int n=res.size();
        for(int i=0;i<n;i++)
        {
            result=result+"/"+res[i];
        }
        if(result=="") result="/";
        return result;
    }

LeetCode的medium题集合(C++实现)十二

标签:c++   leetcode   牛顿迭代法   二分法   

原文地址:http://blog.csdn.net/zhulong890816/article/details/45950751

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!