子集-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] <= 10
  • nums 中的所有元素 互不相同

解法一

思路:

回溯法,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);
        }
    }
}
posted @ 2026-03-27 21:00  狐狸胡兔  阅读(1)  评论(0)    收藏  举报