1. 程式人生 > 其它 >【LeetCode】448.找到所有陣列中消失的數字

【LeetCode】448.找到所有陣列中消失的數字

283.移動零

知識點:陣列;原地雜湊;

題目描述

給你一個含 n 個整數的陣列 nums ,其中 nums[i] 在區間 [1, n] 內。請你找出所有在 [1, n] 範圍內但沒有出現在 nums 中的數字,並以陣列的形式返回結果。

示例
輸入:nums = [4,3,2,7,8,2,3,1]
輸出:[5,6]

輸入:nums = [1,1]
輸出:[2]

解法一:

原地雜湊
這道題目可以和442一起來看,其實原理一模一樣,if什麼都不要求,那自然可以用雜湊表來存,然後再判斷是否出現過
if不想開闢空間,那就可以將這個原始陣列構建成一個雜湊表,也就是原地雜湊,原則就是 既要對遍歷到的數字做出標記,也得能夠不改變原始的陣列;
所以可以把x這個元素放在第x個位置上,那要不影響第x個位置上原來的元素,所以就可以取它的負值,這樣一遍完事之後就都做出了改變; 然後再遍歷一遍,所有不是負值的元素,那就是沒有出現過的;

class Solution:
    def findDisappearedNumbers(self, nums: List[int]) -> List[int]:
        res = []
        size = len(nums)
        for i in range(size):
            index = abs(nums[i])
            if nums[index-1] > 0:
                nums[index-1] = -nums[index-1]
        for i in range(size):
            if nums[i] > 0:
                res.append(i+1)
        return res