[LintCode 90.] k数和 II
90. k数和 II
问题描述
给定n个不同的正整数,整数k(1<= k <= n)以及一个目标数字。
在这n个数里面找出K个数,使得这K个数的和等于目标数字,你需要找出所有满足要求的方案。
样例
样例 1:
输入: [1,2,3,4], k = 2, target = 5
输出: [[1,4],[2,3]]
样例 2:
输入: [1,3,4,6], k = 3, target = 8
输出: [[1,3,4]]
解题思路
DFS。类似八皇后问题,枚举每个位置可能放置的数字即可。需要注意的是结束条件的判断。
补充样例
注意数字不够k个就target==0的情况:
[1,3,6,9,10,13,16,17]
3
33
参考代码
class Solution {
public:
/*
* @param A: an integer array
* @param k: a postive integer <= length(A)
* @param target: an integer
* @return: A list of lists of integer
*/
vector<vector<int>> kSumII(vector<int> &A, int k, int target) {
// write your code here
vector<vector<int>> res;
vector<int> v;
dfs(res, v, A, 0, k, target);
return res;
}
static void dfs(vector<vector<int>>& res, vector<int>& v, vector<int>& A, int start, int k, int target) {
if (k == 0 && target == 0) {
res.push_back(v);
return;
}
if (k <= 0) return;
for (int i=start; i<A.size(); i++) {
v.push_back(A[i]);
dfs(res, v, A, i+1, k-1, target-A[i]);
v.pop_back();
}
}
};