剑指 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
不简便的思路
一开始的想法就是遍历数组,看当前元素加一是否等于后一个元素,如果不等于就说明缺失了那个元素。但是这种思路不仅要处理遇到首尾缺失的情况,而且还要考虑数组大小为一的情况,因为此时程序就不进入循环了。此思路就比较繁琐,不推荐使用。
二分法
此题的本质是寻找数组元素nums[i]和下标i的相等关系,如果nums[i]不等于i则当前下标i即为缺失的元素,后续的nums[i]均不等于i,因此可以将数组分成两个部分,一部分是nums[i]均等于i(为左子数组),一部分nums[i]均不等于i(为右子数组),目标是寻找右子数组中nums[i]不等于i的第一个元素下标,并且数组是有序的,求有序数组中的搜索问题,优先考虑使用二分法。

算法解析:
- 初始化:左边界为i=0,右边界为j=nums.length-1,表示整个数组范围区间。
- 循环二分:当i<=j时循环,即当[i,j]闭区间数组为空时,跳出循环
- 寻找中点:m=(i+j)/2
- 如果数组中点的值等于中点下标,则说明在中点右侧才能找到下标不等于内容的值。进入区间[m+1, j]寻找
- 如果数组中点的值不等于中点下标,则说明在中点左侧才能找到第一个下标不等于内容的值。进入区间[i, m-1]寻找
- 返回值:当循环结束时,变量 i 和 j 分别指向 “右子数组的首位元素” 和 “左子数组的末位元素” 。因此返回 i 即可。
学到和回忆了
- java中获取数组长度的方法:array.length
参考
面试题53 - II. 0~n-1 中缺失的数字(二分法,清晰图解) - 0~n-1中缺失的数字 - 力扣(LeetCode) (leetcode-cn.com)
浙公网安备 33010602011771号