全组合 五种写法
用子集最后一个元素判断数字是否已经用过
# nums.sort()
# dfs1(nums, [], result)
def dfs1(nums, subset, result):
result.append(subset[:])
for n in nums:
if not subset or n > subset[-1]:
subset.append(n)
dfs1(nums, subset, result)
subset.pop()
# input: [1,2,3]
# output: [[], [1], [1, 2], [1, 2, 3], [1, 3], [2], [2, 3], [3]]
思路同上,用下标判断
# dfs2(nums, 0, [], result)
def dfs2(nums, start, subset, result):
result.append(subset[:])
for i in range(start, len(nums)):
# 如果有重复数字,则前面先 nums.sort() 排序,这里即可去重
#if i > index and nums[i] == nums[i - 1]:
# continue
subset.append(nums[i])
dfs2(nums, i + 1, subset, result)
subset.pop()
# input: [1,2,3]
# output: [[], [1], [1, 2], [1, 2, 3], [1, 3], [2], [2, 3], [3]]
分治的思想,对于每个元素进行选择、不选择两种操作,递归结束条件是所有元素都操作过
BFS,每层都是结果之一,下一层追加一个没有选过的数字
基于位运算的做法,感觉通用性不大
最后更新于
这有帮助吗?