LeetCode hot 100—子集

题目

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

示例

示例 1:

复制代码
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

示例 2:

复制代码
输入:nums = [0]
输出:[[],[0]]

分析

要找出一个整数数组 nums 的所有可能子集(幂集),可以使用回溯算法。回溯算法是一种通过尝试所有可能的组合来解决问题的算法,在这个问题中,我们可以通过递归的方式来生成所有可能的子集。

回溯

算法思路

初始化结果集 :创建一个二维向量 result 用于存储所有的子集,初始时包含一个空子集。

回溯函数 :定义一个回溯函数 backtrack,该函数接收当前子集、当前处理的元素索引和原数组作为参数。

  • 终止条件:当处理完所有元素时,将当前子集加入结果集。
  • 选择:对于当前元素,有两种选择:选择该元素加入当前子集,或者不选择该元素。
  • 递归:分别进行选择和不选择的递归调用。
  • 回溯:在递归调用返回后,撤销选择,以便尝试其他组合。

调用回溯函数:从索引 0 开始调用回溯函数。

返回结果集:返回存储所有子集的结果集。

时间复杂度:O(), 是数组的长度

空间复杂度:O()

cpp 复制代码
class Solution {
private:
    // 回溯函数
    void backtrack(std::vector<int>& nums, int start, std::vector<int>& current, std::vector<std::vector<int>>& result) {
        // 将当前子集加入结果集
        result.push_back(current);
        // 遍历剩余元素
        for (int i = start; i < nums.size(); ++i) {
            // 选择当前元素
            current.push_back(nums[i]);
            // 递归调用,处理下一个元素
            backtrack(nums, i + 1, current, result);
            // 回溯,撤销选择
            current.pop_back();
        }
    }
public:
    std::vector<std::vector<int>> subsets(std::vector<int>& nums) {
        std::vector<std::vector<int>> result;
        std::vector<int> current;
        // 调用回溯函数
        backtrack(nums, 0, current, result);
        return result;
    }
};    
相关推荐
栀秋6661 天前
深入浅出链表操作:从Dummy节点到快慢指针的实战精要
前端·javascript·算法
Pyeako1 天前
机器学习之KNN算法
人工智能·算法·机器学习
xhxxx1 天前
从被追问到被点赞:我靠“哨兵+快慢指针”展示了面试官真正想看的代码思维
javascript·算法·面试
报错小能手1 天前
STL_unordered_map
开发语言·c++·哈希算法
可信计算1 天前
【算法随想】一种基于“视觉表征图”拓扑变化的NLP序列预测新范式
人工智能·笔记·python·算法·自然语言处理
月明长歌1 天前
【码道初阶】【LeetCode 110】平衡二叉树:如何用一个“Magic Number”将复杂度从O(N²)降为 O(N)?
linux·算法·leetcode
yaoh.wang1 天前
力扣(LeetCode) 14: 最长公共前缀 - 解法思路
python·程序人生·算法·leetcode·面试·职场和发展·跳槽
历程里程碑1 天前
C++ 9 stack_queue:数据结构的核心奥秘
java·开发语言·数据结构·c++·windows·笔记·算法
t198751281 天前
基于MATLAB的线性判别分析(LDA)降维算法实现方案
开发语言·算法·matlab
仰泳的熊猫1 天前
1108 Finding Average
数据结构·c++·算法·pat考试