有点类似二分搜索,每次判断中间数的平方,大于x则在左半部分继续查找,小于x则在有半部分。这样时间复杂度则为log(x),因为是32位int,所以也就是O(1)常数复杂度。
需要注意的是对溢出的判断。
class Solution {
public:
int _sqrt(int x, int start, int end){
if(start==end)
return start;
int mid = start + (end-start)/2;
if(mid*mid == x)
return mid;
if(INT_MAX/mid < mid)
return _sqrt(x,start,mid-1);
if(mid*mid < x)
return (mid<end)?_sqrt(x,mid+1,end):mid;
if(mid*mid > x)
return (mid>start)?_sqrt(x,start,mid-1):mid;
}
int sqrt(int x) {
if(x==0)
return 0;
int res = _sqrt(x,1,x);
if(INT_MAX/res < res)
return res-1;
return (res*res<=x)?res:res-1;
}
};