心碎的一道题 啊,其实是蛮简单的,但是我想复杂了。在用二分法的时候是在想不好判断条件应该返回哪个值,mid,high还是low,最后发现low跟mid都有可能超过正确值,只有high一定大于等于正确值,枚举一下就好了。
还有数值的大小一定要设成unsigned long long,不然开根号算的数值不够大。
class Solution{
public:
int sqrt(int x){
unsigned long long low=0;//要用unsigned long long不然数值不够大
unsigned long long high=x;
unsigned long long mid=0;
if(x==1)return 1;
while(low<high){ //典型2分查找
mid=(low+high)/2;
if(mid*mid==x){
return mid;
}
else if(mid*mid<x){
low=mid+1;
}
else if(mid*mid>x){
high=mid-1;
}
}
//想了半天还没想清楚,只好枚举一下了,注意一定要用high枚举,mid因为没有变,可能会越界的
if((high-1)*(high-1)==x)return high-1;
else if(high*high==x)return high;
else if((high-1)*(high-1)<x&&high*high>x)return high-1;
else if(high*high<x&&x<(high+1)*(high+1))return high;
}
};