陣列的子集集合
阿新 • • 發佈:2018-12-09
這篇文章是尋找陣列的所有子集的集合,例如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