【LeetCode】448.找到所有陣列中消失的數字
阿新 • • 發佈:2022-03-29
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