• LeetCode偶尔一题 —— 268. 缺失数字


    题目描述

    给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。
    示例 1:

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

    示例 2:

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

    最简单的解法

    刚看到的这道题的时候,第一感觉就是排序,之后直接挨个比较就能找到缺失的数字。时间复杂度O(nlog(n))空间复杂度O(1)

    /**
     * @param {number[]} nums
     * @return {number}
     */
    var missingNumber = function(nums) {
        let i = 0
        nums.sort((a, b) => a - b)
        for (i = 0; i < nums.length; i++) {
            if (i !== nums[i]) {
                return i
            }
        }
        return i
    };
    

    写完之后感觉不用排序也行,可以开辟新的数组来做标记。时间复杂度O(n)空间复杂度O(n)

    /**
     * @param {number[]} nums
     * @return {number}
     */
    var missingNumber = function(nums) {
        let i = 0, tmp = []
        for (i = 0; i < nums.length + 1; i++) {
            tmp[i] = true
        }
        for (i = 0; i < nums.length; i++) {
            if (tmp[nums[i]]) {
                tmp[nums[i]] = false
            }
        }
        return tmp.indexOf(true)
    };
    

    进阶

    其实细心的人可以发现,数组是不含重复数字的,也就是说我们可以将这道题转化为 等差数列的前n项和该数组 的差。时间复杂度O(n), 空间复杂度O(1)

    /**
     * @param {number[]} nums
     * @return {number}
     */
    var missingNumber = function(nums) {
        let n = nums.length, sum = (1 + n) * n / 2
        return sum - nums.reduce((cur, next) => cur + next)
    };
    

    当然,这道题也可以用异或来求解,感兴趣的朋友可以戳下面的链接查看。

    原题地址: https://leetcode-cn.com/problems/missing-number/
    代码不定时更新,欢迎 star 我的 repo

    扫描下方的二维码或搜索「tony老师的前端补习班」关注我的微信公众号,那么就可以第一时间收到我的最新文章。

  • 相关阅读:
    快速开始
    阿里为什么选择RocketMQ
    4 分布式消息队列的协调者
    9 首个Apache中间件顶级项目
    3、用适合的方式发送和接收消息
    2 生产环境下的配置和使用
    TOMCAT加载两次war包(重复加载)
    Google Protocol Buffer 的使用(二)
    Google Protocol Buffer 的使用(一)
    PostgreSQL及PostGIS使用
  • 原文地址:https://www.cnblogs.com/pigpigever/p/13693736.html
Copyright © 2020-2023  润新知