剑指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;
    }
};


欢迎大家在评论区交流~

目录
相关文章
|
29天前
Leetcode第41题(缺失的第一个正数)
这篇文章介绍了解决LeetCode第41题“缺失的第一个正数”的两种方法:使用哈希表和调整数组元素位置,以实现时间复杂度为O(n)且只使用常数级别额外空间的解决方案。
34 0
Leetcode第41题(缺失的第一个正数)
|
6月前
|
Python
用四个数字实现不重复的三位数如何用python实现
主要是利用三个循环,三个嵌套循环让三个数字组合,如果是三个不同的数字就可以打印出来,同时用一个sum来统计他们的个数,最后将print置于最右打印出总数。
104 0
|
3月前
|
搜索推荐 索引 Python
【面试题】缺失的第一个整数
【面试题】缺失的第一个整数
32 0
|
6月前
leetcode-41:缺失的第一个正数
leetcode-41:缺失的第一个正数
34 0
|
6月前
剑指Offer LeetCode 面试题53 - II. 0~n-1中缺失的数字
剑指Offer LeetCode 面试题53 - II. 0~n-1中缺失的数字
31 0
LeetCode-41 缺失的第一个正整数
LeetCode-41 缺失的第一个正整数
|
算法 C语言
【基础算法】浅浅刷个小题 # 移动零 # 丢失的数字 # 转换成小写字母 # 和为零的N个不同整数 # 猜数字 #
【基础算法】浅浅刷个小题 # 移动零 # 丢失的数字 # 转换成小写字母 # 和为零的N个不同整数 # 猜数字 #
|
算法 安全 Swift
LeetCode - #41 缺失的第一个正数
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
|
算法
leetcode:41.缺失的第一个正数
给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
51 0
力扣刷题记录——459.重复的字符串、461. 汉明距离、476. 数字的补数
力扣刷题记录——459.重复的字符串、461. 汉明距离、476. 数字的补数
150 0
力扣刷题记录——459.重复的字符串、461. 汉明距离、476. 数字的补数