Subsets
这是我第一次参加 LeetCode (力扣) 的每月挑战题组,希望留下点笔记,大家可以参考和互相讨论。😃
第十一天问
这题的要求很简单,给你一个只包含 不重复的整数 的数列的情況下,写一个程序来返回 所有可能组成的子集/幂集(Power Set),而且子集不带重复。
看起来挺容易的,就是一个个数字抽出来做组合,直到所有数字组合都迭代过就行了。问题是如何在代码中实现这个邏辑?
题目例子 (引用自LeetCode)
Given a set of distinct integers, nums, return all possible subsets (the power set).
Note: The solution set must not contain duplicate subsets.
Example:
Input: nums = [1,2,3]
Output:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
解题思路
虽然简单,但也有点难到了我,所以就去了 leetcode discussion forum了解了一下,发现了一个叫 Cascading的方法,大概原理就是 :
- 建立一张空列表 (总列)
- 迭代输入数列,每次提取一个元素
- 然后用这元素迭代加入总列中每个元素,再替换成总列
- 重复步骤2-3,直到所有元素都被迭代
最后的结果是一张有2n个子集的列表 (n为输入数列的长度),因此也代表一共运行了2n次。
代码 (时间复杂度:O(2n))
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
result = [[]]
for num in nums:
result += [current + [num] for current in result]
return result
Reference/参考资料:
https://leetcode.com/articles/subsets/#
https://en.wikipedia.org/wiki/Cascade_algorithm