Leetcode-Subsets II
2014-11-16 06:02
423 查看
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 =
Have you met this question in a real interview?
Analysis:
We first create a table of (val,count) to record how many times each number appears in the collection. We then recursive create the subset for each number.
Solution:
NOTE: To increase runtime speed, we can sort the num list and then scan it once to create the table, like this:
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], []
]
Have you met this question in a real interview?
Analysis:
We first create a table of (val,count) to record how many times each number appears in the collection. We then recursive create the subset for each number.
Solution:
public class Solution { public List<List<Integer>> subsetsWithDup(int[] num) { List<List<Integer>> numList = new ArrayList<List<Integer>>(); List<List<Integer>> res= new ArrayList<List<Integer>>(); if (num.length==0) return res; for (int i=0;i<num.length;i++){ int val = num[i]; int index = -1; boolean hasItem = false; for (int j=0;j<numList.size();j++) if (numList.get(j).get(0)<val) continue; else if (numList.get(j).get(0)==val){ hasItem = true; index = j; break; } else { index = j; break; } if (hasItem) numList.get(index).set(1,numList.get(index).get(1)+1); else if (index!=-1){ List<Integer> temp = new ArrayList<Integer>(); temp.add(val); temp.add(1); numList.add(index,temp); } else { List<Integer> temp = new ArrayList<Integer>(); temp.add(val); temp.add(1); numList.add(temp); } } res = subsetsRecur(numList,0); return res; } public List<List<Integer>> subsetsRecur(List<List<Integer>> numList, int curIndex){ int val = numList.get(curIndex).get(0); int num = numList.get(curIndex).get(1); List<List<Integer>> resList = new ArrayList<List<Integer>>(); if (curIndex==numList.size()-1){ for (int i=0;i<=num;i++){ List<Integer> subset = new ArrayList<Integer>(); for (int j=0;j<i;j++) subset.add(val); resList.add(subset); } return resList; } List<List<Integer>> nextResList = subsetsRecur(numList,curIndex+1); for (int i=0;i<=num;i++){ List<Integer> subset = new ArrayList<Integer>(); for (int j=0;j<i;j++) subset.add(val); for (int j=0;j<nextResList.size();j++){ List<Integer> oneRes = new ArrayList<Integer>(); oneRes.addAll(subset); oneRes.addAll(nextResList.get(j)); resList.add(oneRes); } } return resList; } }
NOTE: To increase runtime speed, we can sort the num list and then scan it once to create the table, like this:
public class Solution { public List<List<Integer>> subsetsWithDup(int[] num) { List<List<Integer>> numList = new ArrayList<List<Integer>>(); List<List<Integer>> res= new ArrayList<List<Integer>>(); if (num.length==0) return res; Arrays.sort(num); int curVal = num[0]; int count = 1; for (int i=1;i<num.length;i++) if (num[i]==curVal){ count++; } else { List<Integer> record = new ArrayList<Integer>(); record.add(curVal); record.add(count); numList.add(record); curVal = num[i]; count=1; } List<Integer> record = new ArrayList<Integer>(); record.add(curVal); record.add(count); numList.add(record); res = subsetsRecur(numList,0); return res; } public List<List<Integer>> subsetsRecur(List<List<Integer>> numList, int curIndex){ int val = numList.get(curIndex).get(0); int num = numList.get(curIndex).get(1); List<List<Integer>> resList = new ArrayList<List<Integer>>(); if (curIndex==numList.size()-1){ for (int i=0;i<=num;i++){ List<Integer> subset = new ArrayList<Integer>(); for (int j=0;j<i;j++) subset.add(val); resList.add(subset); } return resList; } List<List<Integer>> nextResList = subsetsRecur(numList,curIndex+1); for (int i=0;i<=num;i++){ List<Integer> subset = new ArrayList<Integer>(); for (int j=0;j<i;j++) subset.add(val); for (int j=0;j<nextResList.size();j++){ List<Integer> oneRes = new ArrayList<Integer>(); oneRes.addAll(subset); oneRes.addAll(nextResList.get(j)); resList.add(oneRes); } } return resList; } }
相关文章推荐
- LeetCode | Subsets II(带有重复数据的数组的子集)
- [Leetcode] Subsets II
- [LeetCode] Subsets II
- [LeetCode] 90. Subsets II
- LeetCode刷题【Array】 Subsets II
- LeetCode_Subsets II
- LeetCode 90: Subsets II
- LeetCode Subsets II
- [LeetCode]90. Subsets II
- leetcode -- Subsets II
- leetcode之Subsets II
- [LeetCode] Subsets II
- [LeetCode] Subsets II
- [LeetCode] Subsets II
- LeetCode-90. Subsets II
- LeetCode 61 Subsets II
- [LeetCode] Subsets II
- leetcode:Subsets II
- leetcode 【 Subsets II 】python 实现
- Leetcode: Subsets II