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]




相关文章
|
3天前
|
算法 C语言
OJ刷题:求俩个数组的交集(没学哈希表?快排双指针轻松搞定!)
OJ刷题:求俩个数组的交集(没学哈希表?快排双指针轻松搞定!)
|
3天前
[leetcode] 705. 设计哈希集合
[leetcode] 705. 设计哈希集合
|
3天前
|
算法 程序员 测试技术
【数据结构-哈希表 一】【原地哈希】:缺失的第一个正整数
【数据结构-哈希表 一】【原地哈希】:缺失的第一个正整数
35 0
|
3天前
|
机器学习/深度学习
【每日一题Day128】LC2357使数组中所有元素都等于零 | 排序+模拟 哈希表
【每日一题Day128】LC2357使数组中所有元素都等于零 | 排序+模拟 哈希表
21 0
|
3天前
|
人工智能
LeetCode刷题Day07——哈希表(n数之和、数组交集)
常见的三种哈希结构: 数组 set(集合) map(映射) 数组对于那些知道长度的题目比较适宜,因为map的空间消耗要比数组的大,所以有的时候用数组更贱简单有效。但是数组的大小是有限的,受到系统栈空间(不是数据结构的栈)的限制。如果数组空间够大,但哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费,这时候可以考虑采用set。set是一个集合,里面放的元素只能是一个key,而有的题目还需要记录一些额外的信息,如下标或出现次数,这时候可以考虑用map。
|
7月前
|
存储
OJ题库:俩个有序序列(数组)合并
OJ题库:俩个有序序列(数组)合并
24 0
|
9月前
|
算法
使用遍历方法和分治法求两个数组的值
看似简单的姐数组中的最大值实际上体现了不同的思路本文将以比较数组大小为背景,分别展示普通算法和分治法,通过对比来简述分治法。 问题描述 给定一个整数数组,编写一个算法来找到数组中的最大值和最小值。
47 0
|
9月前
|
算法
LeetCode-442 数组中重复的数据
LeetCode-442 数组中重复的数据
|
算法
LeetCode——442. 数组中重复的数据
LeetCode——442. 数组中重复的数据
67 0
|
存储 索引
【题型总结】使用双指针+哈希表寻找符合某种条件的字符串/数字的个数
记录第一出现的字符的位置和最后一个出现的字符的位置,如果相减长度为s1的长度,那么证明是连续出现的子串
70 0