剑指offer 56. 0到n-1中缺失的数字

简介: 剑指offer 56. 0到n-1中缺失的数字

题目描述


一个长度为 n−1 的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围 0 到 n−1 之内。

在范围 0 到 n−1 的 n 个数字中有且只有一个数字不在该数组中,请找出这个数字。


数据范围

1≤n≤1000

样例

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


方法一:二分法 O(logn)


观察题目,可以在缺失元素前面的所有元素下标和数值都是相等的,而从该分界线往后则是数值比下标大 1 。


所以,我们可以通过二分法来找到第一个下标与数值不想等的位置,该下标就是 0~n-1 缺失的数字,这其实相等于去求一个数值与下标不相等的左边界。


特殊情况: 当所有数都满足 nums[i] == i 即数组中所有元素的数值都等于其对应的下标时,缺失的元素就是 n 。


07af7e464a8343a5bf85dddd2ed4993c.png


class Solution {
public:
    int getMissingNumber(vector<int>& nums) {
        if (nums.empty())    return 0;
        int l = 0, r = nums.size() - 1;
        while (l < r)
        {
            int mid = l + r >> 1;
            if (nums[mid] != mid)    r = mid;
            else    l = mid + 1;
        }
        if (nums[r] == r)  r++;
        return r;
    }
};


欢迎大家在评论区交流~

目录
相关文章
【剑指offer】- 数组中重复的数字 -48/67
【剑指offer】- 数组中重复的数字 -48/67
|
8月前
剑指Offer LeetCode 面试题53 - II. 0~n-1中缺失的数字
剑指Offer LeetCode 面试题53 - II. 0~n-1中缺失的数字
36 0
剑指offer-1.找出数组中重复的数字
剑指offer-1.找出数组中重复的数字
35 0
|
算法 C语言
【基础算法】浅浅刷个小题 # 移动零 # 丢失的数字 # 转换成小写字母 # 和为零的N个不同整数 # 猜数字 #
【基础算法】浅浅刷个小题 # 移动零 # 丢失的数字 # 转换成小写字母 # 和为零的N个不同整数 # 猜数字 #
|
C++
剑指offer 01. 找出数组中重复的数字
剑指offer 01. 找出数组中重复的数字
58 0
剑指offer 03. 数组中的重复数字
剑指offer 03. 数组中的重复数字
80 0
剑指offer 03. 数组中的重复数字
力扣刷题记录——459.重复的字符串、461. 汉明距离、476. 数字的补数
力扣刷题记录——459.重复的字符串、461. 汉明距离、476. 数字的补数
159 0
力扣刷题记录——459.重复的字符串、461. 汉明距离、476. 数字的补数
|
算法 Java 索引
0~n-1中缺失的数字(剑指offer 53-II)
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
100 0
|
算法 Java 索引
数组中重复的数字(剑指offer 03)
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
102 0
AcWing 68. 0到n-1中缺失的数字
AcWing 68. 0到n-1中缺失的数字
77 0
AcWing 68. 0到n-1中缺失的数字