Python程式設計題28--找到列表中消失的所有數字
阿新 • • 發佈:2021-11-14
題目
給定一個含 n 個正整數的非空列表 nums ,其中 nums[i] 在區間 [1, n] 內。請找出所有在 [1, n] 範圍內但沒有出現在 nums 中的數字,並以列表的形式返回結果。
注意:時間複雜度不能超過 O(n)
。
例如:
給定一個列表:[4, 3, 2, 7, 8, 2, 3, 1],返回結果:[5, 6]
給定一個列表:[1, 1],返回結果:[2]
實現思路1
- 設定一個列表res,用於存放沒有出現在 nums 中的元素
- 設定一個集合tmp_set,用於存放 nums 中的不重複元素
- 遍歷區間 [1, n]範圍內的所有元素,每次用操作符
in
判斷當前元素是否在 tmp_set 中,如果不在則新增到 res
因為題目中限制了 時間複雜度 不得高於
O(n)
,如果上面用in
判斷是否在列表 nums 中,list下查詢元素的時間複雜度為O(n)
,那麼最終時間複雜度將是O(n^2)
;而用
in
判斷是否在集合 tmp_set 中,set下查詢元素的時間複雜度為O(1)
,那麼最終時間複雜度是O(n)
。
程式碼實現
def findDisappearedNumbers(nums): res = [] tmp_set = set(nums) for i in range(1, len(nums) + 1): if i not in tmp_set: res.append(i) return res
上面解題方法中,因為我們使用了
set集合
,最終空間複雜度是O(n)
,如果在不考慮返回列表的空間複雜度情況下,有沒有方法能夠把空間複雜度優化為O(1)
呢?接下來的方法,時間複雜度是
O(n)
,空間複雜度是O(1)
。
實現思路2
- 遍歷nums的所有元素,每次把nums在 [1,n] 下標範圍內出現過的處理為負數
- 遍歷結束後,nums中大於 0 的所有元素所處的位置,即 下標 + 1 就是所求的在 [1, n] 範圍內,但沒有出現在 nums 中的數字
說明:
舉個例子,最初 nums=[4, 3, 2, 7, 8, 2, 3, 1],如果當前元素為 4 ,那麼就把nums中第 4 個元素處理為負數,即 nums=[4, 3, 2, -7, 8, 2, 3, 1]
以此類推,最終 nums=[-4, -3, -2, -7, 8, 2, -3, -1],可以看到 第 5 個元素和 第 6 個元素 都是大於 0 的,那麼就說明 5 和 6 都是 所有在 [1, n] 範圍內但沒有出現在 nums 中的數字。
所以最終得到返回結果:[5, 6]
程式碼實現
def findDisappearedNumbers(nums):
for i in range(len(nums)):
index = abs(nums[i]) - 1
nums[index] = -abs(nums[index])
res = [i + 1 for i, num in enumerate(nums) if num > 0]
return res
作者:wintest
出處:https://www.cnblogs.com/wintest
本文版權歸作者和部落格園共有,歡迎轉載,但必須在文章頁面明顯位置給出原文連結,並保留此段宣告,否則保留追究法律責任的權利。