hot100-60子集

一、题目

给定一个整数数组nums,数组中的元素互不相同,返回该数组所有可能的子集。解集不能包含重复的子集,可以

按任意顺序返回。

二、思路

1、使用回溯算法,按顺序枚举每个元素"选"或"不选"的所有可能组合,通过控制起始下标 start 避免重复,每进入一次递归就将当前路径加入结果,从而生成所有子集。

三、代码

java 复制代码
class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        List<Integer> path = new ArrayList<>();
        backtrack(nums,0,path,res);
        return res;
    }
    public void backtrack(int[] nums,int start,List<Integer> path,List<List<Integer>> res){
        res.add(new ArrayList<>(path));
        for(int i = start; i< nums.length;i++){
            path.add(nums[i]);
            backtrack(nums,i+1,path,res);
            path.remove(path.size()-1);
        }
    }
}

四、举例

【全排列 vs 子集】

1)子集无序**→ 用 start**

  • 原因:子集不关心顺序([1,2] = [2,1]),必须避免重复。

  • start 的作用:强制只往后选,不回头,保证每个组合只按一种顺序(如递增下标)生成,天然去重。

2)全排列有序 → 用 used

  • 原因:排列关心顺序([1,2] ≠ [2,1]),需要尝试所有未用过的元素,无论位置。

  • used 的作用:全局标记哪些元素已用,允许在任意位置选择任意未用元素,从而穷尽所有顺序。

3)全排列有终止条件(path.size() == n

  • 原因:全排列要求用完所有元素,只有当路径长度等于数组长度时,才是一个完整排列。

  • 所以只在此时才将结果加入答案。

4)子集"一进入就加元素"

  • 原因:子集可以是任意长度(包括空集),每一步的 path 都是一个合法子集。

  • 所以每次递归开始就记录当前状态,确保 [], [1], [1,2] 等都被收录。

相关推荐
爱跳舞的烤冷面19 分钟前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号38 分钟前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
马拉AI1 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
MC皮蛋侠客2 小时前
Redis 系列(一):全景与最小闭环——从 `SET` 命令到内存数据结构
数据结构·数据库·redis
疯狂打码的少年2 小时前
【数据结构】队列:定义、顺序队列与链式队列
数据结构·笔记
地平线开发者3 小时前
征程6工具链模型X86推理方式说明
算法
地平线开发者3 小时前
【征程6】校准量化中HistogramObserver解析
算法
蔬菜_3 小时前
前端转全栈-day5(数组、list、set)
java·前端·数据结构·list
OuO-23 小时前
笔试强训 Day 34:ISBN 号码、kotori 和迷宫、矩阵最长递增路径
java·算法·矩阵
程序喵大人4 小时前
【C++进阶】STL算法与函数对象 - 04 find、count和any_of把查询写成意图
开发语言·c++·算法