0~n-1中缺失的数字【每日一练】

1. 思想

我是习惯了使用【left right 闭区间+ left right 指针结束时同时指向目标值】这种模式。更加灵活的是随着题目变化来调整 left right 的区间含义以及结束条件,但我比较笨,还是只用这一招吧。

固定了模式以后,就要根据题目要求设定好判断条件。

例如这道题,先看题,发现它是有序数组中查找,可以用二分。
查找的目标值就定为缺失数字的下一个元素;然后分析当目标值在 mid 左闭区间和右开区间的条件;最后还要考虑查找的元素是不是一定就在一开始划定的搜索区间中

2. 算法代码

int missingNumber(vector<int>& nums) {
    size_t left = 0, right = nums.size()-1;
    size_t mid;
    // 1. 确定二分查找的目标值:找出缺失值的下一个位置
    // 2. 想清楚如果目标值在 mid 的左闭区间([left,mid]),符合什么条件,如果在mid右开区((mid,right]),符合什么条件
    // 3. 目标值是否能在 [left, right] 中找到,如果找不到,就要分类讨论
    while(left < right){
        mid = left + ((right-left)>>1);
        if(nums[mid] > mid){
	        right = mid;
        }else{
    	    left = mid + 1;
        }
    }
    // 对于目标值在数组之外的情况要分类讨论,当缺失值是最后一个,那我们的目标值实际上是在数组之外的,所以要另外处理这个特殊情况
    if(left==nums.size()-1 && nums[left]==left) return nums.size();
    else return nums[left]-1;    
}
  • 注意:最后记得考虑查找的元素是不是一定就在一开始划定的搜索区间中

3. 附录

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值