问题描述:
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
限制:1 <= 数组长度 <= 10000
例子
示例 1:
输入: [0,1,3]
输出: 2
示例 2:
输入: [0,1,2,3,4,5,6,7,9]
输出: 8
提示:
无
代码实现:
二分:有且只有一个数字不在该数组,且每个数都是唯一的,利用二分查找到第一个数组下标与值不对应的,
下标就是缺失的数,在这之前如果数组长度为1要额外判断在左指针到最后时,要判断数组最后一个是否> 与下标对应,如果对应缺失的数就是left+1
顺序查找:从头开始查找,找到下标与值不对应的就是缺失的数,找到最后则缺失的数为数组长度。
1.二分:
时间复杂度:O(logn),空间复杂度:O(1)
class Solution {
public static int missingNumber(int[] nums) {
if(nums.length==0)return -1;// 数组长度为0返回-1
if (nums.length==1)return nums[0]==0?1:0;// 数组长度为1 额外判断
int left=0;
int right=nums.length-1;
while (left<right){
int half=left+((right-left)>>2);// 取一半
if (nums[half]==half){// 下标对应其值
left=half+1; // 左指针指向中点右边一位
if (left==right && nums[left]==left)return left+1;// 到数组最后一位
}else right=half;// 没有对应
}
return right;// 返回第一个数组与下标不对应的值
}
}
2.顺序查找:
时间复杂度:O(n),空间复杂度:O(1)
public static int missingNumber2(int[] nums) {
for (int i=0;i<nums.length;i++){
if (i==nums[i]) continue;
return i;
}
return nums.length;
}
3.运行结果
二分:
顺序查找;
题目来源:力扣(LeetCode)
链接: LeetCode题目