在你提供的代码中,有几个问题需要修正:
std::pair<int, int> p = *map.begin();应为std::pair<int, int> p = *Map.begin();,变量名应与定义一致。map.erase(Map.begin());应为Map.erase(p.first);,需要删除已经使用过的数字。在内层循环
for (int j = 0; j < i; j++)中,将条件改为j <= i,以包含等于的情况。
修复后的代码如下所示:
class Solution {
public:
std::vector<std::vector<int>> result;
std::map<int, int> Map;
int SumPath(vector<int>& path) {
int sum = 0;
for (const auto& item : path) {
sum += item;
}
return sum;
}
void backtrace(vector<int> path, std::map<int, int>& map, int target, int total, int epoch) {
if (SumPath(path) == target) {
result.push_back(path);
return;
} else if (epoch > total) {
return;
}
std::pair<int, int> p = *map.begin();
map.erase(p.first);
int num = p.first;
int times = p.second;
for (int i = 0; i <= times; i++) {
for (int j = 0; j < i; j++) {
path.push_back(num);
}
backtrace(path, map, target, total, epoch + 1);
for (int j = 0; j < i; j++) {
path.pop_back();
}
}
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
for (const auto& item : candidates) {
Map[item]++;
}
backtrace(vector<int>{}, Map, target, Map.size(), 1);
return result;
}
};
修复后的代码逻辑上应该可以正确执行,但请注意使用前要确保输入参数的合法性,并根据实际需求进行适当的调整。
内容由零声教学AI助手提供,问题来源于学员提问




