今天再来练习一道二分查找的算法题。

题目:

 

来源: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的情况导致出错。

解决方案:将边界情况单独处理。以后每次做算法题都要先考虑一下边界问题。