645. Set Mismatch

最明显的方法就是 hash map,很简单,但效率不高,不写了。

因为1~n的等差数组,可以用list替代hash-map,减少空间使用,最后找 index 来返回。

class Solution:
    def findErrorNums(self, nums: List[int]) -> List[int]:
        rank = [0 for _ in range(len(nums))]
        repetition, missing = 0, 1
        for n in nums:
            rank[n-1] += 1
        repetition = rank.index(2)+1
        missing = rank.index(0)+1
        return [repetition, missing]

排序也可以做,排完了遍历,但这个在长度=2的时候有 edge cases,需要注意。

class Solution:
    def findErrorNums(self, nums: List[int]) -> List[int]:
        nums = sorted(nums)
        repetition, missing = 0, 1
        for i in range(len(nums)-1):
            if nums[i] == nums[i+1]:
                repetition = nums[i]
            elif nums[i] < nums[i+1] - 1:
                missing = nums[i] + 1
        if nums[-1] != len(nums):
            missing = len(nums)
        return [repetition, missing]

用set把重复元素去掉的话,set(nums)和目标数组的总和差值就是missing了,目标数组的总和也可以拿等差数列求和来做。

class Solution:
    def findErrorNums(self, nums: List[int]) -> List[int]:
        sumSet = sum(set(nums))
        missing = int(len(nums)*(1+len(nums))/2-sumSet)
        repetition = sum(nums)-sumSet
        return [repetition, missing]

Last updated

Was this helpful?