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)



相关文章
|
SQL 网络协议 关系型数据库
Golang如何优雅连接MYSQL数据库?(上)
Golang如何优雅连接MYSQL数据库?
616 0
Golang如何优雅连接MYSQL数据库?(上)
[蓝桥杯 2023 省 A] 填空问题--幸运数
[蓝桥杯 2023 省 A] 填空问题--幸运数
231 0
|
Linux Windows
Installing, this may take a few minutes...WslRegisterDistribution failed with error: 0x80370114Err
Installing, this may take a few minutes...WslRegisterDistribution failed with error: 0x80370114Err
3103 3
|
存储 前端开发 JavaScript
在React中有效地管理组件之间的通信和数据流
在React中有效地管理组件之间的通信和数据流
126 4
|
存储 数据库
|
设计模式 存储 监控
|
存储 SQL 自然语言处理
关于SQL优化,你需要掌握这些
关于SQL优化,你需要掌握这些方案
235 0
|
机器学习/深度学习 人工智能 自然语言处理
大数据人工智能领域从菜鸟到高手晋级指南
我们身处一个“技术爆炸”和“共享、开源”的时代,先进技术的更新迭代速率超过了历史上任何一个时期,而且这些技术也不再闭塞,人人都可以接触并学习。终身学习已经是我们每个人不得不面对的问题,这一点在大数据/人工智能领域体现的尤为明显:层出不穷的新技术,一方面为我们带来了便利,但同时也使我们面临难以高效学习和选择的窘境。
2573 0