↓快轉到主要內容
  1. LeetCode/

LeetCode 78: Subsets

·1 分鐘· ·
LeetCode Medium Array Backtracking Bit-Manipulation
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2022-10-26

  • 提交紀錄:Wrong Answer ×3 → Accepted → Memory Limit Exceeded → Accepted ×3

解題思路
#

子集合就是每個元素選或不選(Backtracking 變化一),共 2^n 個。迭代寫法:從 [[]] 開始,每處理一個數 x,把目前所有子集合各複製一份加上 x。回溯寫法:dfs(start, path) 先把 path 加入答案,再從 start 往後選下一個。

我的嘗試
#

前三版變數用錯,寫成 c + [nums],加進去的是整個陣列而不是目前的數:[5] 回傳 [[], [[5]]]。改成 num 就 AC 了。2022-10-30 試了另一種寫法,Memory Limit Exceeded。

正確解法
#

class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        res = [[]]
        for x in nums:
            res += [s + [x] for s in res]
        return res

複雜度
#

時間 O(n · 2^n),空間 O(n · 2^n)(輸出)。

要特別避免的錯誤
#

  • 加上的是目前的數 x,不是整個 nums。

面試口說整理
#

每個元素選或不選,我從只有空集合開始,每處理一個數,就把現有的每個子集合複製一份加上它。總共 2 的 n 次方個子集合,時間 O(n · 2^n)。

相關文章

LeetCode 90: Subsets II
·1 分鐘
LeetCode Medium Array Backtracking Bit-Manipulation
LeetCode 90 解題筆記:先排序;遇到跟前一個相同的數,只延伸上一步新產生的那些子集合
LeetCode 79: Word Search
·2 分鐘
LeetCode Medium Array String Backtracking Depth-First-Search
LeetCode 79 解題筆記:從每一格開始回溯,往四個方向比對下一個字元,走過的格子暫時標記,回溯時還原;先用字元次數剪枝
LeetCode 47: Permutations II
·1 分鐘
LeetCode Medium Array Backtracking Sorting
LeetCode 47 解題筆記:先排序,同一層如果跟前一個值相同而且前一個還沒被用,就跳過
LeetCode 39: Combination Sum
·1 分鐘
LeetCode Medium Array Backtracking
LeetCode 39 解題筆記:同一個數可以重複選,所以遞迴時下一層從 i 開始(不是 i + 1),這樣也避免了順序不同的重複
LeetCode 40: Combination Sum II
·1 分鐘
LeetCode Medium Array Backtracking
LeetCode 40 解題筆記:每個數只能用一次而且有重複,排序後下一層從 i + 1 開始,同一層跳過跟前一個相同的值
LeetCode 46: Permutations
·1 分鐘
LeetCode Medium Array Backtracking
LeetCode 46 解題筆記:每一層從還沒用過的數裡選一個,用 used 陣列標記,path 滿了就記錄