這題用二分法普碎。
如果mid*mid == x艾帐,返回mid猪贪;
如果mid*mid < x跷敬,那么說明mid過小,應(yīng)讓low = mid+1哮伟,在右邊繼續(xù)查找
如果mid*mid > x干花,那么說明mid過大,應(yīng)讓high = mid-1楞黄,在左邊繼續(xù)查找
這里用了long池凄,因為m*m可能超過integer最大值。也可以用可以用 mid < x / mid 來避免用long.
另外也可以用數(shù)學(xué)里的牛頓法鬼廓。
//二分法
public int mySqrt(int x) {
long low = 0;
long high = x;// or high = x/2 +1 ;這個規(guī)律可以減少一些復(fù)雜度
while (low <= high) {
long mid = (low + high) / 2;
if (mid * mid <= x && x < (mid + 1) * (mid + 1)) {
return (int) mid;
} else if (mid * mid > x) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return 0;
}