此题通过查找:最大的ans的平方<=目标值
可以利用二分查找的方法,从两头向中间查找,每次查找mid^2是否<=x
①mid^2 <= x 让 左边l = mid+1 //不加1,无法跳出循环
②mid^2 > x 让 右边r = mid-1 //不减1,也无法跳出循环
最后的答案一定是从左边r过来的值,故在r = mid+1之前 , 让ans = mid
//通过 l<=r 、 l=mid+1 和 r=mid-1跳出循环
//以值333为例子 public static int mySqrt(int x) { if(x==0){ return 0; } int l = 1, r = x, ans = -1; while (l <= r) { int mid = (r+l) / 2; if (x/mid >= mid) { // ans = mid; l = mid + 1; System.out.println("左边:" + l +" 右边:"+r); } else { r = mid - 1; System.out.println("左边:" + l+" 右边:"+r); } } return ans; }
-
时间复杂度:O(logx),即为二分查找需要的次数。
-
空间复杂度:O(1)。