LeetCode-78-子集
78. 子集
难度中等1185收藏分享切换为英文接收动态反馈
给你一个整数数组 nums
,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1:
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
输入:nums = [0]
输出:[[],[0]]
提示:
1 <= nums.length <= 10
-10 <= nums[i] <= 10
-
nums
中的所有元素 互不相同
回溯法
public class Solution {
public static List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> ans = new ArrayList<>();
LinkedList<Integer> path = new LinkedList<>();
process(nums, 0, path, ans);
return ans;
}
// 当前来到index位置,做决定,1)不要当前位置的数 2)要当前位置的数
// 如果要当前位置的数,把该数字,放入到path中去
// 如果不要当前位置的数,不把该数字,放入到path中去
public static void process(int nums[], int index, LinkedList<Integer> path, List<List<Integer>> ans) {
if (index == nums.length) {
ans.add(copy(path));
} else {
process(nums, index + 1, path, ans);//不选则nums[index],继续往下走, 左边分支
path.addLast(nums[index]);//答案选择加入nums[index]
process(nums, index + 1, path, ans);//走右边分支
path.removeLast();//回溯,网上走,还原现场
}
}
public static ArrayList<Integer> copy(LinkedList<Integer> path) {
ArrayList<Integer> ans = new ArrayList<>();
for (Integer num : path) {
ans.add(num);
}
return ans;
}
}
迭代递归法实现子集枚举
class Solution {
public static List<List<Integer>> subsets(int[] nums){
List<List<Integer>> ansList = new ArrayList<>();
ansList.add(new ArrayList<>());//加入空集合
for (int i=0;i<nums.length;i++){
List<Integer> ans = new ArrayList<>();
ans.add(nums[i]);
ansList.add(ans);
findSubSets(nums, ans, ansList, i+1);
}
return ansList;
}
private static void findSubSets(int[] nums, List<Integer> ans, List<List<Integer>> ansList, int nextIndex) {
if (nextIndex == nums.length)
return;
for (int i=nextIndex;i<nums.length;i++){
List<Integer> newAns = new ArrayList<>(ans);
newAns.add(nums[i]);
ansList.add(newAns);
findSubSets(nums, newAns, ansList, i+1);
}
}
}