Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
一、题目描述
一个长度为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
限制
- <= 数组长度 <= 10000
难度:简单
此题为简单题,兄弟们可以重拳出击!
二、思路分析
众所周知,力扣上,简单题是真简单,中等题有些困难,困难题看不懂答案。
题目解析
- 0~n-1 中缺失的数字,通过题目描述可以了解:
- 数组长度为 n-1,其中数字都在 0~n-1 范围内
- 数组中数字唯一,不重复
- 0~n-1 有 n 个数字,对于长度为 n-1 的数组,必定少一个数,找到缺失的数字
- 使用一次遍历寻找缺失数字
- 数组有序且数字唯一,正常分布是索引和数字相等,
- 数字发生缺失之后,后续数字和索引不再相等,
- 可以通过一次遍历找到第一次不相等的位置,对应索引就是缺失的数字。
- 使用二分法寻找
- 有序数组满足使用二分法查找条件
- 虽然没有目标值,但是可以通过索引和对应数值比较来作为查找终点
三、AC 代码
- 二分法查找第一个数值大于索引的位置,返回索引即可
public int missingNumber(int[] nums) {
int res = nums.length;
int l = 0, r = nums.length-1;
while(l <= r){
int mid = (l+r) / 2;
if(nums[mid] == mid){
l = mid+1;
}else{
r = mid-1;
res = mid;
}
}
return res;
}
四、总结
知识点
- 数组有序、查找数字,二分方法,好用
- 没有目标值,可以创建目标条件
最后
阳春三月,算法刷起来!LeetCode 剑指 Offer。
简单题,不需要考虑太多,开干就是了。