leetcode刷題——子集,子集 II
阿新 • • 發佈:2018-12-13
78.子集
題目:給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集(冪集)。
說明:解集不能包含重複的子集。
示例:
輸入: nums = [1,2,3] 輸出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
解答
在網上查到了下面這個答案,作者思路很清晰,寫的程式碼也好看 LeetCode解題之Subsets 大概的思路就是,把數字按升序排列,然後依次將後面的數字與前面已有的子集進行組合,直至結束。 該作者的程式碼如下:
class Solution(object):
def subsets(self, nums) :
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
result = [[]]
for num in sorted(nums):
result += [item + [num] for item in result]
"""
第一步得到[[], [1]] 把1和空集進行拼接得到[1]
第二步得到[[], [1], [2], [1, 2]] 把2和[]、[1]進行拼接
第三步得到[[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]] 把3和第二步結果進行拼接
"""
return result
if __name__ == "__main__":
assert Solution().subsets([1, 2, 3]) == [[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]
把列表解析式展開,寫成for
迴圈,也就是:
nums = [1,2,3]
result = [[]]
for num in sorted(nums):
res_new = []
for item in result:
res_new.append(item + [num] )
result += res_new
print(result)
90.子集 II
題目:給定一個可能包含重複元素的整數陣列 nums,返回該陣列所有可能的子集(冪集)。
說明:解集不能包含重複的子集。
示例:
輸入: [1,2,2] 輸出: [ [2], [1], [1,2,2], [2,2], [1,2], [] ]
思路
子集 II 和子集的區別是,子集 II 多了重複元素,如果按照 子集 的方法來做,就會出現重複子集
- [[], [1]]
- [[], [1], [2], [1, 2]]
- [[], [1], [2], [1, 2], [2], [1, 2], [2, 2], [1, 2, 2]]
因此,需要做一個子集的篩選,不再將重複元素放入結果列表中
解答
class Solution(object):
def subsetsWithDup(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
result = [[]]
for num in sorted(nums):
res_new = []
for item in result:
res = item + [num]
if res not in result: # 在此處做篩選,若result中沒有該子集,則放入result中
res_new.append(res)
result += res_new
return result