题目链接
法一(回溯)
public class Solution78 {
private List<List<Integer>> ans;
private List<Integer> path;
public Solution78() {
this.ans = new LinkedList<>();
this.path = new LinkedList<>();
}
private void backtracking(int[] nums, int start) {
ans.add(new LinkedList<>(path));
for (int i = start; i < nums.length; i++) {
path.add(nums[i]);
backtracking(nums, i + 1);
path.remove(path.size() - 1);
}
}
public List<List<Integer>> subsets(int[] nums) {
backtracking(nums, 0);
return ans;
}
}
法二(动态规划)
public class Solution78 {
public List<List<Integer>> subsets_2(int[] nums) {
List<List<Integer>> dp = new ArrayList<>();
dp.add(new ArrayList<>());
for (int i = 0; i < nums.length; i++) {
int curSize = dp.size();
for (int j = 0; j < curSize; j++) {
List<Integer> list = new ArrayList<>(dp.get(j));
list.add(nums[i]);
dp.add(list);
}
}
return dp;
}
本地测试
lay.showTitle(78);
Solution78 sol78 = new Solution78();
int[] nums78 = new int[]{1, 2, 3};
List<List<Integer>> ans78_1 = sol78.subsets(nums78);
arrayOpt.showIntLists(ans78_1);
System.out.println();
List<List<Integer>> ans78_2 = sol78.subsets_2(nums78);
arrayOpt.showIntLists(ans78_2);