1. 回溯算法与子集问题解析
回溯算法是一种通过探索所有可能候选解来找出所有解的算法。当我们需要枚举所有可能的组合时,回溯算法往往是最直接有效的解决方案。子集问题(LeetCode 78题)就是这类问题的典型代表——给定一个不含重复元素的整数数组nums,返回所有可能的子集(幂集)。
回溯算法的核心思想:尝试选择 -> 递归探索 -> 撤销选择,这种"试错"机制能系统性地遍历所有可能性。
在子集问题中,每个元素都有两种状态:被选中或不被选中。对于n个元素的数组,共有2^n个子集。回溯算法通过递归调用模拟这种选择过程,逐步构建所有可能的子集组合。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 子集问题的回溯解法实现
2.1 基础代码结构
让我们先看完整的C++解法代码框架:
cpp复制class Solution {
private:
vector<vector<int>> result; // 存储所有子集结果
vector<int> path; // 存储当前路径(正在构建的子集)
void backtracking(vector<int>& nums, int startIndex) {
result.push_back(path); // 关键点:在递归开始就收集当前状态
if (startIndex >= nums.size()) {
return; // 终止条件(可省略)
}
for (int i = startIndex; i < nums.size(); i++) {
path.push_back(nums[i]); // 选择当前元素
backtracking(nums, i + 1); // 递归探索后续元素
path.pop_back(); // 撤销选择(回溯)
}
}
public:
vector<vector<int>> subsets(vector<int>& nums) {
result.clear();
path.clear();
