## 题目
一个长度为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
解题
方法一:暴力遍历
思路
暴力遍历每一个元素,如果元素与其下标不等则返回该下标,遍历完成后还未返回则直接返回数组的长度。
代码
class Solution {
public int missingNumber(int[] nums) {
for(int i = 0; i < nums.length; i++) {
if (i != nums[i]) {
return i;
}
}
return nums.length;
}
}
方法二:二分查找
思路
- 排序数组中的搜索问题,首先想到 二分法 解决。
- 根据题意,数组可以按照以下规则划分为两部分。
- 左子数组:
nums[i] = i
- 右子数组:
nums[1] != i
- 左子数组:
- 缺失的数字等于 “右子数组的首位元素” 对应的索引;因此使用二分法查找 “右子数组的首位元素” 。
代码
class Solution {
public int missingNumber(int[] nums) {
int start = 0, end = nums.length - 1;
while(start <= end) {
int mid = start + ((end - start) >> 1);
if (nums[mid] == mid) {
start = mid + 1;
} else {
end = mid - 1;
}
}
return start;
}
}
评论区