剑指 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的第一个元素下标,并且数组是有序的,求有序数组中的搜索问题,优先考虑使用二分法。

 

 算法解析:

  1. 初始化:左边界为i=0,右边界为j=nums.length-1,表示整个数组范围区间。
  2. 循环二分:当i<=j时循环,即当[i,j]闭区间数组为空时,跳出循环
    • 寻找中点:m=(i+j)/2
    • 如果数组中点的值等于中点下标,则说明在中点右侧才能找到下标不等于内容的值。进入区间[m+1, j]寻找
    • 如果数组中点的值不等于中点下标,则说明在中点左侧才能找到第一个下标不等于内容的值。进入区间[i, m-1]寻找
  3. 返回值:当循环结束时,变量 i 和 j 分别指向 “右子数组的首位元素” 和 “左子数组的末位元素” 。因此返回 i 即可。

 

学到和回忆了

  • java中获取数组长度的方法:array.length

 

参考

面试题53 - II. 0~n-1 中缺失的数字(二分法,清晰图解) - 0~n-1中缺失的数字 - 力扣(LeetCode) (leetcode-cn.com)

Java 异或 xor - 0~n-1中缺失的数字 - 力扣(LeetCode) (leetcode-cn.com)

posted @ 2022-03-16 20:44  心空之上  阅读(4)  评论(0)    收藏  举报