Subsets
题目意思
给定一个整数数组,求其所有的子集
比如[1,2,3]所有子集为[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
经典的回溯算法
采用了递归框架实现,更加利于理解1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26public static List<List<Integer>> result = new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {
result.clear();
result.add(new ArrayList<Integer>());
int visited[] = new int[nums.length];
int n = nums.length;
backtracking(0,n,visited,nums);
return result;
}
public void backtracking(int i,int n,int visited[],int[] nums){
if(i>=n){
return ;
}
visited[i] = 1;
List<Integer> item = new ArrayList<>();
for(int j=0;j<=i;j++){
if(visited[j]==1)
item.add(nums[j]);
}
if(item.size()>0)
result.add(item);
backtracking(i+1,n,visited,nums);
visited[i] = 0;
backtracking(i+1,n,visited,nums);
}
SubsetsII
题目意思
输入一个整形数组,该数组可能存在重复的数字。返回得到这个数组的所有子集,比如输入[1,2,2],返回[[],[1],[1,2],[1,2,2],[2],[2,2]]
和上个求子集题目不同的是这里可能含有相同的串
1 | public class SubSetsII { |
以上是我写的代码,实在求子集I中加了个判断重复结果的逻辑,就得到了。
大神代码
下面是看网上大神写的代码。
1 | public List<List<Integer>> subsetsWithDup(int[] nums) { |
1 |
|
这个大神直接两套循环解决,解决思路我用结果状态集来展示
假设输入的是[1,2,2]