剑指 Offer 53 - II. 0~n-1中缺失的数字 #Java #二分法

88 阅读1分钟

一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。

解题思路

  • 看到有序数组,首先想到二分法
  • 分析题目,实际要我们找的就是不等于对应值的第一个索引的值,即 nums[mid] != mid
  • 所以可以直接用二分法
    • 如果 nums[mid] == mid ,low指针右移
    • 如果 nums[mid] != mid , high指针左移
    • 最后low指针的值,就是我们要找的

代码

class Solution {
    public int missingNumber(int[] nums) {
        int low = 0;
        int high = nums.length - 1;
        int mid = 0;
        while (low <= high) {
            mid = (low + high) / 2;
            if (nums[mid] == mid) {
                low = mid + 1;
            } else {
                high = mid - 1;
            }
        }
        return low;
    }
}

二分法的一个特性的总结:

如无别的跳出条件,low、high指针,最后一定会位于符合两个条件的交界处,而mid指针由于int类型的特性,往往会指向和low指针同一个节点,此时,再根据具体的条件来判断low、mid、high指针接下来的移动,可以更容易地来确定退出时,它们分别指向哪个节点。