0%
Loading ...

【Leetcode 筆記】78. Subsets

image 1723992583102

題目解釋

給定一個由 distinct 元素組成的整數 array nums,傳回所有可能的元素 subsets
解決方案集不得包含重複的子集,您可以 以任何順序回傳組合

範例

  • 輸入: nums = [1, 2, 3]
  • 輸出: [[],[1],[2],[1, 2],[3],[1, 3],[2, 3],[1, 2, 3]]

最佳解法

經典的排列組合題,這邊借用 Neetcode 畫的圖,原始解說連結 點此

file

假設我們有一個 list subsets,我們每次都可以決定要不要加元素進去,
root 的左邊是選擇加入元素,而 root 的右邊是選擇不加入元素。

而我們把做決策的步驟畫成一棵樹,
因此最左方的 child 是放滿元素的狀態,最右方是什麼都不放。

因為 subsets 裡面的元素會不斷被抽換掉,
所以我們每次遞迴都要把新狀態給加入最後要 return 的 results 裡面。

程式碼

class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        results = []
        subsets = []

        def _dfs(i):
            if i >= len(nums):
                results.append(subsets.copy())
                return
            else:
                # add element, left leaf
                subsets.append(nums[i])
                _dfs(i + 1)

                # remove element, right leaf
                subsets.pop()
                _dfs(i + 1)

        _dfs(0)
        return results

時間複雜度

O(n * 2^n),n 是 nums 的長度。

2^nsubsets 的總數,對於每個 subset,
我們可能需要 O(n) 的時間來複製並把它加到結果集中。

空間複雜度

O(n),n 是 nums 的長度。

結語

高頻題,務必好好把握❗

數據女巫 𝔻.𝕡𝕪𝕤 🔮

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

The reCAPTCHA verification period has expired. Please reload the page.