今天再来练习一道二分查找的算法题。
题目:
来源:leetcode第69题,难度为简单
思路:
这道题确实是简单的,暴力解法一眼就可以看出来,也可以通过,我们主要来看一下二分解法。
开始位置:
1.定义left在数组最左端,right在数组最右端
2.每次取中间mid,如果中间的值小于目标值,就让left=mid,否则就让right=mid-1,一直循环
3.当left=right的时候,就是结果。
4.返回结果。
代码实现:
class Solution {
public int mySqrt(int x) {
if(x<1) return 0;
int left=1,right=x;
while(left<right)
{
int mid=left+(right-left+1)/2;
if((long)mid*mid<=x)
left=mid;
else
right=mid-1;
}
return left;
}
}
总结:
这次总结一下新出现的问题:
1.刚开始将mid设置为int类型,但是后面mid*mid溢出。
解决方案:将mid*mid临时设置成long 类型,就不会溢出了。
2.没有考虑x<1的情况导致出错。
解决方案:将边界情况单独处理。以后每次做算法题都要先考虑一下边界问题。