想法:针对第一章的二分法再做一些训练
阅读后想法:寻找第一个x*x<=target的数,用left边界来缩小;第一个target左边的数
注意:由于存在mid*mid,这里面有可能出现int类型的越界,需要通过类型转换(long long)
class Solution {
public:
int mySqrt(int x) {
if(x==0 || x==1) {
return x==0?0:1;
}
int right = x-1;
int left = 1;
int ans = 1;
while(left<=right) {
int mid = (right+left)/2;
if((long long)mid*mid <= x) {
ans = mid;
left = mid+1;
}else {
right = mid-1;
}
}
return ans;
}
};
想法:和上一题一样,可以通过二分进行遍历,寻找到是否有符合==target的数
class Solution {
public:
bool isPerfectSquare(int num) {
int right = num;
int left = 0;
while(left<=right) {
int mid = (right+left)/2;
if((long long)mid*mid==num) {
return true;
}else if((long long)mid*mid<num) {
left = mid+1;
}else {
right = mid-1;
}
}
return false;
}
};
二分查找总结(os: 用于场景):
1. 主要用于需要查找的题目,需要判断这个数组中是否存在某个元素满足条件,又不想全部遍历,我们可以通过两边缩进的方式,来实现整个数组的搜索功能
2. 搜索数值符合,搜索位置符合(其实也是数值),搜索平方根(其实就是对数值的对比判断),搜索平方数
3. 找最后满足条件的数,这个是有点难度的,比如找满足条件(与target之间的对比关系)的第一个数(先找到一个数,满足了,再去它的右半区间-缩小left,寻找还有没有更接近-靠近target的满足数)
4. 找第一个满足的数,缩小right,找左半区间