博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode 90 Subsets II
阅读量:4171 次
发布时间:2019-05-26

本文共 2408 字,大约阅读时间需要 8 分钟。

题目描述:
Given a collection of integers that might contain duplicates, nums, return all possible subsets.
Note: The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,2], a solution is:
[
  [2],
  [1],
  [1,2,2],
  [2,2],
  [1,2],
  []

]

分析:

在上一题    的基础上,本题允许集合中包含重复元素,

与上题类似,先把相应的二叉树画出来,以集合{6,8,8}为例,二叉树如下:

注意到处理第三个元素8时,因为前面已经处理了一次8,所有第三层中,我们只在已经添加过8的集合{6,8}、{8}上再添加8,而没有在集合{6}, {}上添加8(画叉的那个分支),假设下面还有一个8,那么我们只在第四层的包含两个8的集合{6,8,8}、{8,8}上选择添加8(当然,也要有“不选择”这个分支),其它都只有“不选择”这一个分支。终上所述,dfs时,如果当前处理的数字之前总共出现了k次,那么我们要处理的集合中必须包含k个该元素,即:已经包含了k个该元素的集合,有“选择”和“不选择”两个分支,而其他的集合只有“不选择”这一个分支。代码如下:

python代码:

class Solution(object):    def subsetsWithDup(self, nums):        """        :type nums: List[int]        :rtype: List[List[int]]        """        self.sub_sets=[]        self.sub_set=[]        nums.sort()        self.dfs(nums,0)        return self.sub_sets            def dfs(self,nums,index):        if index==len(nums):            temp=self.sub_set[:]#通过切片,生成sub_set的拷贝,这一步很重要!!!            self.sub_sets.append(temp)#将生成的拷贝追加到sub_sets里            return         firstSame=index        while (firstSame>=0 and nums[firstSame]==nums[index]):            firstSame-=1        firstSame+=1 #firstSame是第一个与nums[index]相同数字的位置        k=index-firstSame # k表示和nums[index]相同数字的个数,不包含自己        if k==0 or (len(self.sub_set)>=k and self.sub_set[len(self.sub_set)-k]==nums[index]):            #选择nums[index]            self.sub_set.append(nums[index])            self.dfs(nums,index+1)            self.sub_set.pop()        #不选择nums[index]        self.dfs(nums,index+1)
C++代码:

class Solution {private:    vector
>sub_sets;public: vector
> subsetsWithDup(vector
& nums) { sub_sets.clear(); sort(nums.begin(),nums.end()); vector
sub_set; dfs(nums,0,sub_set); return sub_sets; } void dfs(vector
&nums,int index,vector
&sub_set) { if(index==nums.size()) { sub_sets.push_back(sub_set); return; } int firstSame=index; while(firstSame>=0&&nums[firstSame]==nums[index]) { firstSame--; } firstSame++;//firstSame是第一个与nums[index]相同数字的位置 int k=index-firstSame;//和nums[index]相同数字的个数,不包含自己 if(k==0||(sub_set.size()>=k && sub_set[sub_set.size()-k]==nums[index])) { //选择nums[index] sub_set.push_back(nums[index]); dfs(nums,index+1,sub_set); sub_set.pop_back(); } //不选择nums[index] dfs(nums,index+1,sub_set); }};

你可能感兴趣的文章
Pro*C 基础教程-简化版_Vol4 登录
查看>>
制作自己的MSDN2001OCT绿色版
查看>>
一个使用Pro*C实现增删改查的小例子
查看>>
Pro*C中嵌入PlSql块小例
查看>>
Pro*C动态SQL使用小例
查看>>
OCI小例
查看>>
Save could not be completed. Eclipse国际化的问题解决
查看>>
Xblo(JSP+Servlet+JavaBean+Oracle单用户Blog)
查看>>
Unable to use IEC module under PortablePython_1.1_py2.5.4
查看>>
实用英文地址书写格式
查看>>
在oracle中通过connect by prior来实现递归查询!
查看>>
百度空间如何才能另存为 mht
查看>>
ORACLE 中ROWNUM用法总结! (转)
查看>>
如何更新ARXSGPO.xml
查看>>
Unable To View Status Diagram [ID 746806.1]
查看>>
Accounting 里的Debit 和 credit是如何区分的。。。
查看>>
10gR1中ora-00201,ora-01103错误的解决办法
查看>>
Oracle用户权限管理
查看>>
EdtiPlus-最好用的文本编辑器+使用技巧集萃
查看>>
oracle merge into 用法详解
查看>>