[LeetCode]69. x 的平方根 (java实现)二分
1. 题目
2. 读题(需要重点注意的东西)
思路:
我们是要找一个最大的 y,使得y的平方小于等于 x,由于x的范围极大,一个个遍历一定会超超时;
通过二分
进行优化:
我们看到上述描述中,明显有一个条件能够作为二分的判断,即找的是最大的y的平方小于 x 的值;二分的充分必要条件并非单调,而是有一个条件,即二分左右的点满足不同的性质
,这条正好满足该性质,即二分左边的点都满足平方小于 x ,右边的点都满足平方大于 x 。
具体思路: 从 1 到 x 进行二分,每次二分一个中间的位置即可。
3. 解法
---------------------------------------------------解法---------------------------------------------------:
class Solution {
public int mySqrt(int x) {
int l = 0, r = x;
while(l < r){
int mid = l + r + 1>> 1;
// 用x/mid防止越界
if(mid <= x/mid) l = mid;
else r = mid - 1;
}
return l;
}
}
可能存在的问题:
4. 可能有帮助的前置习题
5. 所用到的数据结构与算法思想
- 二分
6. 总结
掌握二分的两个模板!