題目連結: 78. Subsets
題目描述:給你一個整數陣列 nums,陣列中的元素互不相同。返回該陣列所有可能的子集(冪集)。
解集不能包含重複的子集。你可以按任何順序返回解集。
Example 1:
Input: nums = [1,2,3]
Output: [[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
Example 2:
Input: nums = [0]
Output: [[],[0]]
解題思路:
對於 nums 中的每一個數字,我們都有兩個選擇:「要」,還是「不要」。
以下程式碼是使用回溯法來找出所有可能的子集。
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
n = len(nums)
ans =[]
def f(index, subset):
ans.append(subset[:])
for i in range(index, n):
subset.append(nums[i])
f(i+1,subset)
subset.pop()
f(0,[])
return ans
演算法分析:
f(i + 1, subset)
基於這個選擇,向下進行探索。將當前數字加入到 subset 路徑中、當前的選擇為基礎,遞迴呼叫函式自身,當深層的探索結束並返回後,將剛剛加入的數字從 subset 中移除(subset.pop()
)。subset[:]
是可以把當前狀態當作副本存放結果裡,這樣就不用額外建立一個陣列來存放,也不會影響到ans的內容。複雜度分析:
時間複雜度為 O(n * 2ⁿ)
。
空間複雜度: O(n)
(這裡的空間複雜度指的是額外的輔助空間,不包括儲存最終答案所需的空間。)。
有問題可以底下留言!
下回見!!