题面一看就是dfs 每一步dfs都把路径存下来即可
第一遍代码较为繁琐 后面有优化
class Solution {
List<List<Integer>> lists = new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {
boolean[] vis = new boolean[nums.length];
dfs(new ArrayList<>(),nums,vis,0,0);
return lists;
}
public void dfs(List<Integer> list,int[] nums,boolean[] vis,int step,int fori){
List<Integer> temp = new ArrayList<>(list);
lists.add(temp);
if (step == nums.length) return;
for (int i = fori; i < nums.length; i++) {
if (vis[i]) continue;
list.add(nums[i]);
vis[i] = true;
dfs(list,nums,vis,step+1,i+1);
list.remove(step);
vis[i] = false;
}
}
}
第一次遍写完发现有许多用不到的地方我们进行代码量的优化。
由于每次只继续拼接身后所以vis数组可以省去
也不用记录当前步数 也可以省去 step
优化后
class Solution {
List<List<Integer>> lists = new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {
dfs(new ArrayList<>(),nums,0);
return lists;
}
public void dfs(List<Integer> list,int[] nums,int fori){
List<Integer> temp = new ArrayList<>(list);
lists.add(temp);
for (int i = fori; i < nums.length; i++) {
list.add(nums[i]);
dfs(list,nums,i+1);
list.remove(list.size()-1);
}
}
}