1. 程式人生 > >陣列的子集集合

陣列的子集集合

這篇文章是尋找陣列的所有子集的集合,例如nums=[1,2],子集集合為[[],[1],[2],[1,2]]。這個題目來自於leetcode78. Subsets。

一,動態規劃思想:

  • 狀態:前面i個數的子集集合res1
  • 狀態轉移方程:前面i+1個數的子集集合res2 = 前面i個數的子集集合res1 + res1所有項新增第i+1個數的集合cur

程式碼:

res = [[]]  
for num in nums :  
    for temp in res[:] :  
        x = temp[:]  
        x.append(num)  
        res.append(x)  
return
res

簡寫:

res = [[]]
for num in nums:
    res += [item+[num] for item in res]
return res

二、位操作:對於陣列[1,2,3],可以用一個下標0和1表示是否選擇該數字,0表示未選擇,1表示選中,那麼每一組3個0和1的組合表示一種選擇,3位共有8種選擇。

res = []
for i in range(1<<len(nums)):# 子集總共有多少個集合
    tmp = []
    for j in range(len(nums)):# 當前子集集合的生成
        if i & 1
<< j: # 當前子集集合包含第j字元的判斷 tmp.append(nums[j]) res.append(tmp) return res