力扣第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
中的所有元素 互不相同
思路和解题方法
- 首先,定义一个二维向量ans,用于存储最终的结果集。同时,定义一个一维向量path,用于存储当前的路径。
- 接下来,我们使用回溯算法进行搜索。回溯算法是一种深度优先搜索的策略,在搜索过程中不断更新路径,并在遇到终止条件时进行回溯。
- 回溯函数backtracking的参数有两个:const vector<int> &num表示输入的数组,index表示当前要处理的元素的索引。
- 在每次调用backtracking函数时,我们都将当前的路径path加入到结果集ans中,这样就能保证最后得到的结果包含了所有可能的子集。
- 然后我们判断是否已经遍历完了整个数组,即index是否等于num.size()。如果是的话,表示已经处理完了所有的元素,直接返回。
- 否则,我们从当前元素的索引index开始遍历数组nums。对于每个元素nums[i],我们将其加入当前的路径path中,然后递归调用backtracking函数,将下一个元素的索引设为i + 1,继续向下搜索。
- 当递归完成后,即已经处理完了以当前元素为起点的所有情况,我们需要进行回溯操作。将路径path中的当前元素移除,即执行path.pop_back(),这样可以清空当前位置的选择,以便尝试其他的选择。
- 最后,在主函数subsets中,我们清空结果集ans和路径path,并调用backtracking函数,从索引0开始进行回溯搜索。
- 最终,返回结果集ans,即包含了给定数组nums的所有子集。
复杂度
时间复杂度:
O(n * 2^n)
时间复杂度:
- 回溯算法的时间复杂度通常是指数级的,因为每个元素都有"选择"和"不选择"两种情况
空间复杂度
O(n)
- 空间复杂度: O(n)
c++ 代码
class Solution {
public:
vector<vector<int>> ans; // 存储结果的二维向量
vector<int> path; // 存储当前路径的一维向量
void backtracking(const vector<int> &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<vector<int>> subsets(vector<int>& nums) {
ans.clear(); // 清空结果集
path.clear(); // 清空路径
backtracking(nums, 0); // 从索引0开始回溯
return ans; // 返回结果集
}
};
觉得有用的话可以点点赞,支持一下。
如果愿意的话关注一下。会对你有更多的帮助。
每天都会不定时更新哦 >人< 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)