0~n-1中缺失的数字(剑指offer 53-II)

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

一、题目描述



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


限制:

1 <= 数组长度 <= 10000


二、思路讲解



1、方法一

     

对于我这个算法小白来说,每次看见查找的题总要试试能不能暴力破解,这次成功了。

     

因为数组是递增的,索引和值对应不上,则必然缺失了;若全对上了,则必然缺失了n。


2、方法二

     

一说到查找,首选应该是二分查找。

     

承接上面的思路,如果二分位置的索引等于值,那么左边都不用查了,直接将右边作为子数组,继续二分即可;如果二分位置的索引不等于值,则将右边的指针左移一位,继续二分。直至两指针相遇,返回i指针对应的值即可。


三、算法描述



1、方法一


遍历数组nums,若索引与值不同,则返回索引;若能够走出循环,则必然数组里面必然是0~n-1的情况,则直接返回n        


四、Java代码实现



1、方法一


class Solution {
  public static int missingNumber(int[] nums) {
    //遍历数组
    for(int i=0; i<nums.length; i++) {
      //因为数组为递增数组,所以若索引小于它对应的值,则说明缺失了这个索引本该对应的数字
      if(i < nums[i]) {
        return i;
      }
    }
    //考虑[0]、[0,1]、[0,1,2]……的情况
    return nums.length;
    }
}


2、方法二


class Solution {
    public int missingNumber(int[] nums) {
        int i = 0, j = nums.length - 1;
        while(i <= j) {
            int m = (i + j) / 2;
            if(nums[m] == m) 
                i = m + 1;
            else 
                j = m - 1;
        }
        return i;
    }
}


五、时空复杂度分析



1、方法一

     

时间复杂度:O(n)        遍历数组一次

     

空间复杂度:O(1)


2、方法二

     

时间复杂度:O(logn)        二分查找

     

空间复杂度:O(1)



相关文章
|
1月前
Leetcode第41题(缺失的第一个正数)
这篇文章介绍了解决LeetCode第41题“缺失的第一个正数”的两种方法:使用哈希表和调整数组元素位置,以实现时间复杂度为O(n)且只使用常数级别额外空间的解决方案。
35 0
Leetcode第41题(缺失的第一个正数)
|
6月前
|
Python
用四个数字实现不重复的三位数如何用python实现
主要是利用三个循环,三个嵌套循环让三个数字组合,如果是三个不同的数字就可以打印出来,同时用一个sum来统计他们的个数,最后将print置于最右打印出总数。
113 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 缺失的第一个正整数
|
算法 安全 Swift
LeetCode - #41 缺失的第一个正数
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
剑指offer 56. 0到n-1中缺失的数字
剑指offer 56. 0到n-1中缺失的数字
66 0
|
算法
leetcode:41.缺失的第一个正数
给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
51 0
|
C++
剑指offer 01. 找出数组中重复的数字
剑指offer 01. 找出数组中重复的数字
50 0
力扣刷题记录——459.重复的字符串、461. 汉明距离、476. 数字的补数
力扣刷题记录——459.重复的字符串、461. 汉明距离、476. 数字的补数
150 0
力扣刷题记录——459.重复的字符串、461. 汉明距离、476. 数字的补数