645.错误的集合 数组遍历、哈希表、数学方法 三种解题总结!

简介: 645.错误的集合 数组遍历、哈希表、数学方法 三种解题总结!

645.错误的集合


https://leetcode-cn.com/problems/set-mismatch/solution/645cuo-wu-de-ji-he-shu-zu-bian-li-ha-xi-94hcp/

难度:简单


题目

集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。

给定一个数组 nums 代表了集合 S 发生错误后的结果。

请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。


示例

示例 1:
输入:nums = [1,2,2,4]
输出:[2,3]
示例 2:
输入:nums = [1,1]
输出:[1,2]


分析


这道题做不出来的,肯定是上学的时候数学老师长得不够漂亮!


纯数学的角度解题:

sum(nums) - sum(set(nums)) = 重复的数字

(1 + len(nums)) * len(nums) - sum(set(nums)) = 丢失的数字


循环数组

如何一次for循环获取到重复的数字和丢失的数字呢?

  1. 我们需要对数组进行排序
  2. 重复的数字就是nums[i + 1] == nums[i]
  3. 丢失的数字呢需要分情况考虑
  • 当nums[0] != 1,丢失的数字是1
  • 当nums[-1] != len(nums),丢失的数字是len(nums)
  • 排除上面两种场景,那么当nums[i + 1] - nums[i] = 2时,
    丢失的数字为nums[i] + 1


哈希表操作

  1. 使用Counter将nums转化为一个字典dict
  2. 然后for循环1 -- n
  3. 没有在dict中找到的数字为丢失的
  4. 找到的数字value为2的便是重复的


解题



数学解题

class Solution:
    def findErrorNums(self, nums):
        ln, total = len(nums), sum(set(nums))
        return [sum(nums) - total, (1 + ln) * ln // 2 - total]


循环数组解题

class Solution:
    def findErrorNums(self, nums):
        ln = len(nums)
        repeat = lose = -1
        nums.sort()
        if nums[0] != 1:
            lose = 1
        elif nums[-1] != ln:
            lose = ln
        for i in range(1, ln):
            if nums[i] == nums[i - 1]:
                repeat = nums[i]
            if nums[i] - nums[i - 1] == 2:
                lose = nums[i] - 1
        return [repeat, lose]


哈希表解题

from collections import Counter
class Solution:
    def findErrorNums(self, nums):
        ln = len(nums)
        dic = Counter(nums)
        repeat = lose = -1
        for i in range(1, ln + 1):
            tmp = dic.get(i, 0)
            if tmp == 0:
                lose = i
            elif tmp == 2:
                repeat = i
        return [repeat, lose]




相关文章
|
机器学习/深度学习 存储 JSON
chatgpt说它有上千亿的参数,是什么意思?
chatgpt说它有上千亿的参数,是什么意思?
1860 0
|
C语言
【C语言】实现通讯录管理系统
【C语言】实现通讯录管理系统
395 0
|
算法 vr&ar C#
使用Unity进行虚拟现实开发:深入探索与实践
【8月更文挑战第24天】使用Unity进行虚拟现实开发是一个充满挑战和机遇的过程。通过掌握Unity的VR开发技术,你可以创造出令人惊叹的VR体验,为用户带来前所未有的沉浸感和乐趣。随着技术的不断进步和应用场景的不断拓展,VR开发的未来充满了无限可能。希望本文能为你提供有用的指导和启发!
|
关系型数据库 MySQL 数据库
Docker 安装 MySQL
一、查看 MySQL 版本 访问 MySQL 镜像库地址:https://hub.docker.com/_/mysql?tab=tags 。 可以通过 Tags 查看其他版本的 MySQL,默认是最新版本 mysql:latest 。 你也可以在下拉列表中找到其他你想要的版本: 二、拉取 MySQL 镜像 拉取官方的最新版本的镜像: docker pull mysql:latest 三、查看本地镜像 使用以下命令来查看是否已安装了 mysql: docker images 四、运行容器 安装完成后,我们可以使用以下命令来运行 mysql 容器: docker run -itd --name m
1734 0
|
Ubuntu Shell
【Ubuntu系统】三步更新自己的Cmake最新版本
Ubuntu系统中通过三步简单流程更新Cmake到最新版本的具体操作方法,包括卸载旧版本、下载并运行安装脚本以及创建软链接。
3339 1
|
Linux 数据安全/隐私保护
Linux系统忘记密码的三种解决办法
这篇博客介绍了三种在Linux忘记密码时重置登录密码的方法:1) 使用恢复模式,通过控制台界面以管理员权限更改密码;2) 利用Linux Live CD/USB启动,挂载硬盘分区并使用终端更改密码;3) 进入单用户模式,自动以管理员身份登录后重置密码。每个方法都提供了详细步骤,提醒用户在操作前备份重要数据。
|
机器学习/深度学习 存储 并行计算
【Pytorch神经网络理论篇】 27 图神经网络DGL库:简介+安装+卸载+数据集+PYG库+NetWorkx库
DGL库是由纽约大学和亚马逊联手推出的图神经网络框架,支持对异构图的处理,开源相关异构图神经网络的代码,在GCMC、RGCN等业内知名的模型实现上也取得了很好的效果。
2161 0
|
JavaScript 数据安全/隐私保护
JS逆向之webpack 通用扣取思路
JS逆向之webpack 通用扣取思路
1809 0
JS逆向之webpack 通用扣取思路
LNK 1104 无法打开文件“XXX.lib”
LNK 1104 无法打开文件“XXX.lib”
686 0
LNK 1104 无法打开文件“XXX.lib”
|
前端开发 数据可视化 Java
antd pro与spring boot集成开发平台搭建
antd pro与spring boot集成开发平台搭建
1051 0

热门文章

最新文章