[LeetCode剑指 Offer 53 - II. 0~n-1中缺失的数字 ] | 刷题打卡

238 阅读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. 最容易想到的思路,遍历数组,比较当前值和前一个值的差值,大于1的说明缺了一个数。没找到的说明缺少的是最后一个。数字范围从0~n,所以前驱数字从-1开始
  2. 数字范围从0~n,所以也可以直接比较数组的indexnum[index],不一致的就是想要找的数字,如果遍历完没找到,说明该数字是最后一个
  3. 有序数组搜索,首先想到二分搜索,利用上2中indexnum[index]的关系,用折半的方式查找

三、AC 代码:

class Solution {
    fun missingNumber(nums: IntArray): Int {
        return solution3(nums)
    }

    fun solution3(nums:IntArray):Int{
        var l = 0
        var r = nums.size-1
        while(l<=r){
            var middle = (l+r)/2
            if(nums[middle]==middle){
                l = middle+1
            }else{
                r = middle-1
            }
        }
        return l
    }

    fun solution2(nums:IntArray):Int{
        var n = nums.size
        for(i in 0 .. n-1){
            if(nums[i]!=i){
                return i
            }
        }
        return n
    }

    fun solution1(nums:IntArray):Int{
        var pre = -1
        for(i in 0 .. nums.size-1){
            var current= nums[i]
            if(current-pre>1){
                return pre+1
            }else{
                pre = current
            }
        }
        return pre+1
    }
}

四、总结:

有序数组搜索,首先想到二分搜索