子集-leetcode
题目描述
给你一个整数数组 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] <= 10nums中的所有元素 互不相同
解法一
思路:
回溯法,k表示集合中的元素个数,当确定第一个元素的时候,在寻找k-1个元素的集合,当k=0时为停止条件。例如k=2,将1放入集合,此时寻找k-1=1的集合,将2放入集合,此时寻找k=0的集合,将当前的结果加入最终的结果。为了保证不会回头寻找,记录一个位置,使其总是寻找下面的元素,例如{1,2}寻找到了,2恢复状态,此时集合为{1},回溯的时候不使2重新找到,标记一个起始,使其跳过2。
代码:
public class Solution {
private List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {
int n = nums.length;
for(int i=0; i<=n; i++){
backTrack(0,i,new ArrayList<Integer>(),nums);
}
return res;
}
public void backTrack(int start,int k,List<Integer> cur,int[] nums){
//停止条件
if(k==0){
res.add(new ArrayList<>(cur));
return;
}
//选择元素
for(int i=start;i<nums.length;i++){
cur.add(nums[i]);
backTrack(i+1,k-1,cur,nums);
//恢复状态
cur.remove(cur.size()-1);
}
}
}

浙公网安备 33010602011771号