经典算法学习——二分分治/减治

模式识别:

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

相关题目:

LCR 173. 点名 - 力扣(LeetCode)

4. 寻找两个正序数组的中位数 - 力扣(LeetCode)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值