我是靠谱客的博主 幸福饼干,最近开发中收集的这篇文章主要介绍0~n-1中缺失的数字,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

输入: [0,1,3]
输出: 2

输入: [0,1,2,3,4,5,6,7,9]
输出: 8

特殊例子: 

输入: [0]
输出: 1

输入:[1]
输出: 0


最直接的思路就是按照数组遍历, 找出下标和值不对应的数字,  如果没有就是nums.count, 时间复杂度是O(N).

class Solution {
    func missingNumber(_ nums: [Int]) -> Int {

        for (i,num) in nums.enumerated() {
            if (i == num) {

            } else {
                return i
            }
        }
        return nums.count 
    }

}

优化下, 自然是用二分法了, 先找中间位置的数字, 

  • 中间位置的数字 == 下表, 说明缺失的数字在后半部分, 并且不可能是此值, 所以用left = index+1
  • 中间位置的数字 != 下表,  说明缺失的数字在前半部分, 同时也有可能是本身,所以index不能减1

最后还有2个特殊的值, 头部值和尾部值,

  • 头部就判断是否等于0, 等于0, 说明正常;  不等于0, 那缺失的就是此数字
  • 尾部判断是否等于count-1, 如果相等, 那就是缺了最后一个数字; 如果不相等, 说明缺失的数字在0~count-1之间
class Solution {
    func missingNumber(_ nums: [Int]) -> Int {
        let count = nums.count
        // 特殊用例, 如果最后一个都符合条件, 那就是count不满足
        if nums[count-1] == count-1 {
            return count
        }
        // 头部不满足条件,返回0
        if nums[0] != 0 {
            return 0
        }

        // 开始二分查找
        var left = 0
        var right = count-1
        while left<right {

            // 找到中间位置的数字
            let index = (left+right)/2
            // 中间位置数字相等,说明在后半部分,
            if index == nums[index] {
                left = index+1
            } else {
                // 中间位置数字不相等,说明在前半部分,也有可能是本身,所以index不能减1
                right = index
            }


        }

        return left

    }
}

 

最后

以上就是幸福饼干为你收集整理的0~n-1中缺失的数字的全部内容,希望文章能够帮你解决0~n-1中缺失的数字所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(82)

评论列表共有 0 条评论

立即
投稿
返回
顶部