非常具有启发性的多解题

Leetcode Link: 645. 错误的集合 - 力扣(LeetCode)

题目

解法一

思路重复元素 = nums 和 - 去重后 nums 的和 缺失元素 = 1到n的和(正常的和) - 去重后nums的和

题解

class Solution:
    def findErrorNums(self, nums: List[int]) -> List[int]:
        res = [0,0]
        res[0] = sum(nums) - sum(list(set(nums)))
        res[1] = sum([i for i in range(1, len(nums)+1)]) - sum(list(set(nums)))
        return res

解法二

思路: 哈希表,查数量就行

题解

class Solution:
    def findErrorNums(self, nums: List[int]) -> List[int]:
        comp = [ 0 for _ in range(len(nums)+1)]
        for val in nums:
            comp[val] += 1
        
        res = [0, 0]
        for i, val in enumerate(comp[1:]):
            if val == 2: res[0] = i+1  # 注意遍历的起点,这里需要 +1
            if val == 0: res[1] = i+1
            # 可以提前退出
            if res[0] != 0 and res[1] != 0: break
        return res