一、题目描述
一个长度为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)