之前第一次刷题做两数之和就难受了半天,虽然现在写比较简单,但是今天又遇到了一个找和为目标值的下标,但是不局限于两个数,蒙了。一下是实现方式
#include <iostream>
#include <vector>
#include <algorithm>
void findCombinations(const std::vector<int>& nums, int target, int start, std::vector<int>& current, std::vector<std::vector<int>>& result) {
if (target == 0) {
// 找到一个组合
result.push_back(current);
return;
}
for (int i = start; i < nums.size(); ++i) {
if (i > start && nums[i] == nums[i - 1]) continue; // 跳过重复元素
if (nums[i] > target) break; // 剩余元素不可能达到目标值
current.push_back(nums[i]);
findCombinations(nums, target - nums[i], i + 1, current, result); // 递归查找
current.pop_back(); // 回溯
}
}
std::vector<std::vector<int>> findAllCombinations(std::vector<int>& nums, int target) {
std::sort(nums.begin(), nums.end()); // 首先排序
std::vector<std::vector<int>> result;
std::vector<int> current;
findCombinations(nums, target, 0, current, result);
return result;
}
int main() {
std::vector<int> nums = {10, 1, 2, 7, 6, 1, 5};
int target = 8;
auto combinations = findAllCombinations(nums, target);
for (const auto& combo : combinations) {
std::cout << "Combination: ";
for (int num : combo) {
std::cout << num << " ";
}
std::cout << std::endl;
}
return 0;
}