Subsets II
来源:互联网 发布:淘宝如何判定虚假交易 编辑:程序博客网 时间:2024/06/06 00:41
题目原型:
Given a collection of integers that might contain duplicates, S, return all possible subsets.
Note:
- Elements in a subset must be in non-descending order.
- The solution set must not contain duplicate subsets.
For example,
If S = [1,2,2]
, a solution is:
[ [2], [1], [1,2,2], [2,2], [1,2], []]
基本思路:这个题在上一个的基础上增加了重复数字。那么怎么处理这些重复数字呢?我们先定义一个插入点,即每次递归返回到上一层时需要从哪个集合开始插入num[index].分两种情况:
1、当此时的num[index]!=num[index+1]时,我们从集合的第一个元素开始插入。
2、当num[index]==num[index+1]时,我们就要注意插入位置了。此时又分两种情况。
1.如果说insertNum为0,也就是说一开始就是相同的数字如数组[2,2] 那么在最后一个元素插入即可。2的subset是[],2,那么[2,2]的subset是[],2,22,也就是从2开始插入的;
2.如果说不为0,那么就是从tmp.size()-insertNum开始插入。如[1,2,2],2的subset是[],2,那么[1,2]的subset是[],2,1,12.此时记录insertNum为[1,2]的长度也就是2.那么[1,1,2]的subset在[1,2]的基础上从tmp.size()-insertNum开始插入,即在[1,2]的基础上增加11,112。最后的结果是[],2,1,12,11,112。
int insertNum = 0;//需要插入num[index]的集合数目public ArrayList<ArrayList<Integer>> subsetsWithDup(int[] num){ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();if(num==null||num.length==0)return list;Arrays.sort(num);return getSubsets(num, 0);}public ArrayList<ArrayList<Integer>> getSubsets(int[] num , int index){ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();if(index==num.length-1){list.add(new ArrayList<Integer>());ArrayList<Integer> number = new ArrayList<Integer>();number.add(num[index]);list.add(number);return list;}else{ArrayList<ArrayList<Integer>> tmp = getSubsets(num, index+1);ArrayList<Integer> tmpnum ;for(int i = 0;i<tmp.size();i++){list.add(tmp.get(i));}for(int i = 0;i<tmp.size();i++){if(num[index]==num[index+1]){//开始插入点分两种情况//1.如果说insertNum为0,也就是说一开始就是相同的数字如数组[2,2] 那么在最后一个元素插入即可。2的subset是[],2,那么[2,2]的subset是[],2,22,也就是从2开始插入的//2.如果说不为0,那么就是从tmp.size()-insertNum开始插入。如[1,2,2],2的subset是[],2,那么[1,2]的subset是[],2,1,12.此时记录insertNum为[1,2]的长度也就是2.那么[1,1,2]的//subset在[1,2]的基础上从tmp.size()-insertNum开始插入,即在[1,2]的基础上增加11,112。最后的结果是[],2,1,12,11,112int startIndex = insertNum==0?tmp.size()-1:tmp.size()-insertNum;if(i>=startIndex){tmpnum = new ArrayList<Integer>(tmp.get(i));tmpnum.add(0, num[index]);list.add(tmpnum);}}else{insertNum = tmp.size();tmpnum = new ArrayList<Integer>(tmp.get(i));tmpnum.add(0, num[index]);list.add(tmpnum);}}return list;}}
0 0
- 【LeetCode】 Subsets Subsets II
- 【LeetCode】Subsets & Subsets II
- LeetCode Subsets && Subsets II
- Subsets and Subsets II
- LeetCode Subsets && Subsets II
- LeetCode-Subsets & Subsets II
- Subsets II
- Subsets II
- Subsets II
- Subsets II
- Subsets II
- Subsets II
- Subsets II
- Subsets II
- Subsets II
- Subsets II
- Subsets II
- Subsets II
- git管理日志
- python 文件和文件夹操作
- 登陆抛出异常
- 微信开发源码讲解
- 超nb的网页标签弹窗js代码!
- Subsets II
- CentOS yum有时出现“Could not retrieve mirrorlist ”的解决办法——resolv.conf的配置
- 使用 Spring 2.5 注释驱动的 IoC 功能
- 为啥苹果鼠标反人类? 一周外设要闻回顾
- Memcached源码分析之状态机(二)
- python 学习笔记
- struts文件上传详解
- Java字符串之性能提升
- 链表建立,插入,删除,输出,释放