leetcode69题 二分法help see哪错了,为什么打印不出来
问题描述:
public class demoEZ69 {
public static void main(String[] args) {
System.out.println(mySqrt(9));
}
public static int mySqrt(int x){ // when x == 25
int l = 0, r = x, ans = -1;
while(l <= r){ //while (l <= 25) //4 <= 5
int mid = 1 + (r-1) /2; // mid == 13 //mid == 6 //mid ==3
if((long) mid* mid <= x){ // if((long)169 <= 25) //if((long)36 <= 25)
ans = mid; //ans == 9 //ans == 3
l = mid + 1;// l == 3 + 1 ==4
}else{
r = mid -1; //r == 13 - 1 ==12 //r == 6-1 == 5
}
}
return ans;
}
}
答
小写的字母l和数字1
int mid = l+(r-l)/2,
代码的第8行
答
int mid = l + (r-l) /2; // mid == 13 //mid == 6 //mid ==3
这里是l吧 不是数字1 吧
这一行错了
答
当(long) mid * mid == x要return掉mid的值并且不需要定义ans 多次操作会使时间更慢 换成如下:
public static int mySqrt(int x) {
int l = 1, r = x / 2 + 1;
// 循环不变量 始终维持在区间 [left, right] 中查找,当 left = right + 1 时,区间为空,查找结束
// 当 left == right 时,区间 [left, right] 依然有效
while (l <= r) {
// 防止溢出
int mid = l + ((r - l) >> 1);
// mid 大于 √x ,在 mid 前半区间 [left, mid - 1] 中查找,不是 [left, mid]
// 是因为会当查找到 target 时,直接返回 mid,所以没必要再考虑 mid
if (mid > x / mid) {
r = mid - 1;
// mid 小于 √x ,在 mid 后半区间 [mid + 1, right] 中查找
} else if (mid < x / mid) {
l = mid + 1;
// mid 等于 √x ,代表查找到 target,则直接返回
} else {
return mid;
}
}
return r;
}