二分查找
适合的规则:
- sorted(单调递增或者递减)
- bounded(存在上下界)
- Accessible by index(能够通过索引访问):链表不适合,数组适合、
二分查找的代码:
面试题
69. Sqrt(x)
我的代码:
错误:测试案例中的2147395599无法通过,因为是int类型的最大整数值,tmp计算会超过int的取值范围
class Solution {
public int mySqrt(int x) {
int left=0;
int right=x;
int mid=0;
while(left<=right){
mid=(left+right)/2;
int tmp=mid*mid; //错误步骤,在这里会超过int的取值范围
if(tmp==x){return mid;}
if(tmp<x){
left=mid+1;
}else{right=mid-1;}
}
return mid-1;
}
}
改进:测试案例0,1无法通过。mid为0
class Solution {
public int mySqrt(int x) {
int tmp=0;
int left=0;
int right=x;
int mid=0;
while(left<=right){
mid=(left+right)/2;
tmp=x/mid; //用除法的形式避免越界
if(mid==tmp){return mid;}
if(mid<tmp){
left=mid+1;
}else if(mid>tmp){right=mid-1;}
}
if(mid>tmp){return mid-1;} //需考虑具体的取整下限
return mid;
}
}
正确的:
class Solution {
public int mySqrt(int x) {
int tmp=0;
int left=0;
int right=x;
int mid=1;
if(x==0){return 0;} //加入特殊案例判断
if(x==1){return 1;}
while(left<=right){
mid=(left+right)/2;
tmp=x/mid;
if(mid==tmp){return mid;}
if(mid<tmp){
left=mid+1;
}else if(mid>tmp){right=mid-1;}
}
if(mid>tmp){return mid-1;}
return mid;
}
}
老师的方法:二分法
python代码:
老师的方法:牛顿迭代法
看不懂
python代码: