算法 查找 【剑指 Offer 53 - II. 0~n-1中缺失的数字】

41 篇文章 1 订阅

目录

一、题目描述

二、思路

步骤

三、代码


一、题目描述

一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。

示例 1:

输入: [0,1,3]
输出: 2


示例 2:

输入: [0,1,2,3,4,5,6,7,9]
输出: 8

 

二、思路

本题的中心思想为二分查找。

根据题意,数组可以按照以下规则划分为两部分。

左子数组:nums[i] =   i ;
右子数组:nums[i] !=i ;

缺失的数字等于 “右子数组的首位元素” 对应的索引;因此考虑使用二分法查找 “右子数组的首位元素”。

步骤

1.初始化:边界i=0,右边界j = len(nums)-1 ;代表闭区间[i,j]。

2.循环二分:当i≤ j时循环(即当闭区间[i, j]为空时跳出) ;

    2.1.计算中点m=(i+ j)//2,中"//"向下取整除法;

    2.2.若nums[m]=m,则“右子数组的首位元素”-定在闭区间[m+ 1,j]中,因此执行i=m+ 1;

    2.3.若nums[m]≠m,则“左子数组的末位元素”-定在闭区间[i,m- 1]中,因此执行j=m- 1;

3.返回值:跳出时,变量i和j分别指向“右子数组的首位元素”和“左子数组的末位元素”。因此返回i即可。

三、代码

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int left = 0;
        int right = nums.size()-1;
        while(left<=right)
        {
            int mid = (left+right)/2;
            if(nums[mid] == mid)
            {
                left = mid+1;
            }
            else
            {
                right = mid -1;
            }
        }
        return left;

    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值