給定乙個含 n 個正整數的非空列表 nums ,其中 nums[i] 在區間 [1, n] 內。請找出所有在 [1, n] 範圍內但沒有出現在 nums 中的數字,並以列表的形式返回結果。
注意:時間複雜度不能超過o(n)
。
例如:給定乙個列表:[4, 3, 2, 7, 8, 2, 3, 1],返回結果:[5, 6]
給定乙個列表:[1, 1],返回結果:[2]
因為題目中限制了 時間複雜度 不得高於res =o(n)
,如果上面用in
判斷是否在列表 nums 中,list下查詢元素的時間複雜度為o(n)
,那麼最終時間複雜度將是o(n^2)
;而用
in
判斷是否在集合 tmp_set 中,set下查詢元素的時間複雜度為o(1)
,那麼最終時間複雜度是o(n)
。
tmp_set = set(nums)
for i in range(1, len(nums) + 1):
if i not in tmp_set:
return res
上面解題方法中,因為我們使用了set集合
,最終空間複雜度是o(n)
,如果在不考慮返回列表的空間複雜度情況下,有沒有方法能夠把空間複雜度優化為o(1)
呢?接下來的方法,時間複雜度是
o(n)
,空間複雜度是o(1)
。
說明:for i in range(len(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]
index = abs(nums[i]) - 1
nums[index] = -abs(nums[index])
res = [i + 1 for i, num in enumerate(nums) if num > 0]
return res
python程式設計題彙總(持續更新中……)
Python 列表 根據索引找到元素下標
如果你想在乙個有著成千上百個元素中的列表中,定位某個值,或字元元素的下標時 或者要根據索引對列表進行切片。那麼這篇文章有可能能夠幫助到你。str list where are you print 該索引在列表中的位置在 str list.index you 結果 該索引在列表中的位置在 2 num ...
Python核心程式設計 列表
1.1 基礎概念 1.2 序列的分類 2.1列表的使用 步長表示每次獲取元素的間隔,預設是1 可以省略不寫 步長不能是0,但可以是是負數 in用來檢查指定元素是否在列表當中 not in 用來檢查指定元素是否不在列表當中 len 獲取列表中元素的個數 max 獲取列表中最大值 min 獲取列表中最小...
python程式設計題 python程式設計題庫
上期題目連線 1000道python題庫系列分享十一 9道 上期題目答案 本期題目 機器之心報道機器之心編輯部想要備戰 python 面試,這兩個專案有千道 python 問題與實現。之前機器之心介紹了 phd 大牛的求職之路,很多讀者感覺這位大牛太厲害了,他的經歷對我們幫助不大。對於一般的機器學習...