剑指 Offer 53 - II. 0~n-1中缺失的数字
题目
一个长度为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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/que-shi-de-shu-zi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
前置知识:
标签:
思路
1.自己的思路
1.1遍历查找
根据题目意思可知,第一个与数组索引不相等的数字就是丢失的数字,遍历查找即可。
代码
class Offer53IIV0 {
public int missingNumber(int[] nums) {
int i = 0;
for (int num : nums) {
if (num != i){
return i;
}
i++;
}
return i;
}
}
复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(1)
1.2 二分查找
根据题意,数组可以按照以下规则划分为两部分。
左子数组: $nums[i] = i $;
右子数组:
n
u
m
s
[
i
]
≠
i
nums[i] \ne i
nums[i]=i;
缺失的数字等于 “右子数组的首位元素” 对应的索引;因此考虑使用二分法查找 “右子数组的首位元素” 。
代码
class Offer53IIV1 {
public int missingNumber(int[] nums) {
int left = 0;
int right = nums.length - 1;
while (left <= right){
int mid = (left + right) >> 1;
if (nums[mid] == mid){
left = mid + 1;
}else {
right = mid - 1;
}
}
return left;
}
}
复杂度分析
- 时间复杂度:O(logn)
- 空间复杂度:O(n)
总结
二分查找有多个变种,需要掌握