Python編程題28--找到列表中消失的所有數字


題目

給定一個含 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

更多Python編程題,等你來挑戰:Python編程題匯總(持續更新中……)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM