模式识别:
1. 数组 2. 有序或部分有序:
基本使用二分查找极其变种
算法:丢弃一半的数据
!!二分法一般都是使用 while 循环,迭代比较多,用递归的比较少!!
二分查找文字模板:
1. while 循环,判断条件:left <= right
2. 如果 mid 满足,直接返回
3. 不满足,分别根据条件判断 left = mid + 1 还是 right = mid - 1
4. 整体不满足 跳出 while 循环后 return left
代码模板:
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] == target) {
return mid;
}
else if (nums[mid] > target) {
// 下一轮搜索区间:[left..mid - 1]
right = mid - 1;
}
else {
// 此时 nums[mid] < target
// 下一轮搜索区间:[mid + 1..right]
left = mid + 1;
}
}
表达替换:
mid=left+(right-left)/2;
等价于
mid=left+(right-left)>>1;
模板加一:
class Solution {
public:
int takeAttendance(vector<int>& records) {
int left=0,right=records.size()-1;
while(left <= right){
int mid=left+(right-left)/2;
if(mid>1 && records[mid]!=mid && records[mid-1] == mid-1) return mid;
else if(records[mid]!=mid) right = mid-1;
else left = mid+1;
}
⭐⭐别管为什么了,二分查找最后就是要返回left 就嗯背完事
return left;
}
};
⭐⭐如果程序中出现 mid-1 这种,就一定要先保证 mid > 1