赞
踩
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842…,
由于返回类型是整数,小数部分将被舍去。
二分法:
class Solution { public: int mySqrt(int x) { if(x<0)return -1; if(x<2)return x; int l=0,r=x/2+1,mid; while(true){ mid=l+((r-l)/2); if(l>=r)break; if((long)mid*mid>x){ r=mid-1;//注意是-1,有移动,制造l>r条件,否则特殊情况会死循环超时,如x=3,l=mid时死循环无法退出 } else if((long)mid*mid<x){ l=mid+1;//注意是+1,有移动,制造l>r条件,否则特殊情况会死循环超时,如x=3,l=mid时死循环无法退出 } else if((long)mid*mid==x){ l=mid;break; } } if(l*l>x)l=l-1; return l; } };
牛顿迭代:(方法超时)
class Solution {
public:
int mySqrt(int x) {
if(x<0)return -1;
if(x<=1)return x;
const double err = 1e-8;
double num=x;
while(abs(x-num*num)>=err){
num=(num+x/num)/2.0;
}
return num;
}
};
牛顿迭代通过对高阶函数求导做切线每次取切线与x轴焦点作为下次验证的变量取值,图形验证更直观,收敛速度快。
二分法的时间复杂度是logn,牛顿迭代会超时。
牛顿迭代法会超时,时间复杂度没有定论分析,主要优点是收敛速度快,收敛速度是解决NP问题最重要的指标。
NP(Nondeterministic Polynomially,非确定性多项式)类问题是指一个复杂问题不能确定是否在多项式时间内找到答案,但是可以在多项式时间内验证答案是否正确。NP类问题数量很大,如完全子图问题、图着色问题、旅行商(TSP)问题等。在P和NP问题中,P的难度最低,NP由于只对验证答案的时间作了限定,从而有可能包含某些无法在多项式时间内找到答案的问题,即NP是比P更困难的问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。