力扣第78题 子集 看我以前的回溯问题的 直接秒了

题目

78. 子集

中等  (简单题O~O)

相关标签

位运算   数组   回溯

给你一个整数数组 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 中的所有元素 互不相同

思路和解题方法

  1. 首先,定义一个二维向量ans,用于存储最终的结果集。同时,定义一个一维向量path,用于存储当前的路径。
  2. 接下来,我们使用回溯算法进行搜索。回溯算法是一种深度优先搜索的策略,在搜索过程中不断更新路径,并在遇到终止条件时进行回溯。
  3. 回溯函数backtracking的参数有两个:const vector &num表示输入的数组,index表示当前要处理的元素的索引。
  4. 在每次调用backtracking函数时,我们都将当前的路径path加入到结果集ans中,这样就能保证最后得到的结果包含了所有可能的子集。
  5. 然后我们判断是否已经遍历完了整个数组,即index是否等于num.size()。如果是的话,表示已经处理完了所有的元素,直接返回。
  6. 否则,我们从当前元素的索引index开始遍历数组nums。对于每个元素nums[i],我们将其加入当前的路径path中,然后递归调用backtracking函数,将下一个元素的索引设为i + 1,继续向下搜索。
  7. 当递归完成后,即已经处理完了以当前元素为起点的所有情况,我们需要进行回溯操作。将路径path中的当前元素移除,即执行path.pop_back(),这样可以清空当前位置的选择,以便尝试其他的选择。
  8. 最后,在主函数subsets中,我们清空结果集ans和路径path,并调用backtracking函数,从索引0开始进行回溯搜索。
  9. 最终,返回结果集ans,即包含了给定数组nums的所有子集。

复杂度

        时间复杂度:

                O(n * 2^n)

时间复杂度:

  • 回溯算法的时间复杂度通常是指数级的,因为每个元素都有"选择"和"不选择"两种情况

        空间复杂度

               O(n)

  • 空间复杂度: O(n)

c++ 代码

class Solution {
public:
    vector> ans;  // 存储结果的二维向量
    vector path;  // 存储当前路径的一维向量

    void backtracking(const vector &num, int index) {
        ans.push_back(path);  // 将当前路径加入结果集中
        if(index == num.size()) {
            return ;  // 当遍历到数组末尾时,返回
        }

        for(int i = index; i < num.size(); i++) {
            path.push_back(num[i]);  // 将当前元素加入路径中
            backtracking(num, i + 1);  // 递归调用下一个元素
            path.pop_back();  // 回溯,将路径中的当前元素移除
        }
    }

    vector> subsets(vector& nums) {
        ans.clear();  // 清空结果集
        path.clear();  // 清空路径

        backtracking(nums, 0);  // 从索引0开始回溯

        return ans;  // 返回结果集
    }
};

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

你可能感兴趣的:(回溯,leetcode,数据结构,leetcode,c++,算法,回溯)