美文网首页力扣算法刷题
645.错误的集合 数组遍历、哈希表、数学方法 三种解题总结!

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

作者: 清风Python | 来源:发表于2021-07-04 23:00 被阅读0次

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]

欢迎关注我的公众号: 清风Python,带你每日学习Python算法刷题的同时,了解更多python小知识。

我的个人博客:https://qingfengpython.cn

力扣解题合集:https://github.com/BreezePython/AlgorithmMarkdown

相关文章

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

    645.错误的集合[https://leetcode-cn.com/problems/set-mismatch/s...

  • leetcode第138题:复制带随机指针的链表

    题目描述 考点 哈希表 链表 解题思路 使用哈希表record存储:当前结点,和其对应复制的结点; 遍历链表中的每...

  • 82. LeetCode.1. 两数之和

    标签: 数组 双指针 哈希表 难度: 简单 题目描述 解法: 哈希表 遍历数组,每访问一个数,就在前面访问过的...

  • c#集合

    集合 Hashtable(哈希表)动态数组点阵列(BitArray)堆栈(Stack) 队列(Queue)

  • LeetCode: 36 有效的数独

    【记录性文章-数组】 代码思路:本质上还是判断数组内重复的题,所以还是使用一边判断是否在哈希表中,一边遍历向哈希表...

  • Swift-集合

    集合的初始化 集合的成员变量 遍历 集合的增删改查 集合中的数学方法

  • 【MySQL学习】No.3 SQL索引

    索引的出现是为了提高查询效率,常用的主要包含三种数据结构:哈希表、有序数组和搜索树。 哈希表 哈希表是一种以键 -...

  • 350. Intersection of Two A

    解法一:使用哈希表 用哈希表来建立nums1中字符和其出现个数之间的映射, 然后遍历nums2数组,如果当前字符在...

  • HashMap底层实现原理解析

    我们常见的有集合数据有三种结构:1、数组结构 2、链表结构 3、哈希表结构 下面我们来看看各自的数据结构的特点: ...

  • 2021-12-30 846. 一手顺子

    排序加哈希表:排序,接着用哈希表存储元素出现的次数,然后遍历排序后的数组,从低元素出发,判定是否满足接下来的递增元...

网友评论

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

    本文链接:https://www.haomeiwen.com/subject/cfovultx.html