leetcode刷题——子集,子集 II

部分内容参考此文章 :LeetCode解题之Subsets

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值