动态规划:
题目描述:
给出一个可能包含重复元素的整数集合S,返回该整数集合的所有子集。
注意:
你给出的子集中的元素要按非递增的顺序排列
给出的解集中不能包含重复的子集
例如:
如果S =[1,2,2], 给出的解集应该是:
[↵ [2],↵ [1],↵ [1,2,2],↵ [2,2],↵ [1,2],↵ []↵]
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],↵ []↵]
输入描述:
输出描述:
示例1:
输入:
输出:
看不懂代码可以学习一下下面链接上回溯法的文章,写的挺好的
https://blog.csdn.net/versencoder/article/details/52071930
代码:
import java.util.ArrayList;
import java.util.Arrays;
public class Solution {
ArrayList<ArrayList<Integer>> result= new ArrayList<>();
public ArrayList<ArrayList<Integer>> subsetsWithDup(int[] num) {
if (num == null || num.length <= 0)
return result;
ArrayList<Integer> temp=new ArrayList<>();
Arrays.sort(num);
dfs(num,0,temp);
return result;
}
public void dfs(int[] num,int start,ArrayList<Integer> temp) {
//if(start>=num.length)return;
result.add(new ArrayList<> (temp));
for(int i=start;i<num.length;i++) {
if (i>start&&num[i]==num[i - 1])
continue;
temp.add(num[i]);
dfs(num,i+1,temp);
temp.remove(temp.size()-1);
}
}
}