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