剑指 Offer 53-Ⅱ. 0~n-1 中缺失的数字

218 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

一、题目描述

一个长度为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

限制

  • <= 数组长度 <= 10000

难度:简单

此题为简单题,兄弟们可以重拳出击!

二、思路分析

众所周知,力扣上,简单题是真简单,中等题有些困难,困难题看不懂答案。

题目解析

  1. 0~n-1 中缺失的数字,通过题目描述可以了解:
    • 数组长度为 n-1,其中数字都在 0~n-1 范围内
    • 数组中数字唯一,不重复
    • 0~n-1 有 n 个数字,对于长度为 n-1 的数组,必定少一个数,找到缺失的数字
  2. 使用一次遍历寻找缺失数字
    • 数组有序且数字唯一,正常分布是索引和数字相等,
    • 数字发生缺失之后,后续数字和索引不再相等,
    • 可以通过一次遍历找到第一次不相等的位置,对应索引就是缺失的数字。
  3. 使用二分法寻找
    • 有序数组满足使用二分法查找条件
    • 虽然没有目标值,但是可以通过索引和对应数值比较来作为查找终点

三、AC 代码

  • 二分法查找第一个数值大于索引的位置,返回索引即可
public int missingNumber(int[] nums) {
        int res = nums.length;
        int l = 0, r = nums.length-1;
        while(l <= r){
            int mid = (l+r) / 2;
            if(nums[mid] == mid){
                l = mid+1;
            }else{
                r = mid-1;
                res = mid;
            }
        }
        return res;
}

image.png

四、总结

知识点

  • 数组有序、查找数字,二分方法,好用
  • 没有目标值,可以创建目标条件

最后

阳春三月,算法刷起来!LeetCode 剑指 Offer

简单题,不需要考虑太多,开干就是了。