1. 程式人生 > >leetcode刷題——子集,子集 II

leetcode刷題——子集,子集 II

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