classSolution { public: intmySqrt(int x){ int left=0; int right=x; while(left<=right){ int mid=(right-left)/2+left; if((longlong)mid*mid==x) return mid; elseif((longlong)mid*mid<x){ left=mid+1; } elseif((longlong)mid*mid>x){ right=mid-1; } } return right; } };
2.没有想到的解法,还是二分做了一个变式,然后用了除法防止溢出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
classSolution { publicintmySqrt(int x){ int i = 1; int j = x; int ans = 0; while (i <=j){ int mid = i + (j-i)/2; // upper bound的形式,因为我们要找的ans要是最接近于x的最大的数,利用upper bound if (mid <= x/mid){ i = mid +1; ans = mid; // 只要mid <= x/mid,left左边界就会一直向右移动,ans就会一直更新(变大),直到不在满足mid <= x/mid的条件为止,ans就会停止更新,永远停在满足mid<=x/mid条件下面的最后一次更新,即满足ans * ans <= mid的最大值。 } else j = mid-1; }