- k Sum II
中文English
Given n unique postive integers, number k (1<=k<=n) and target.
Find all possible k integers where their sum is target.
Example
Example 1:
Input: [1,2,3,4], k = 2, target = 5
Output: [[1,4],[2,3]]
Example 2:
Input: [1,3,4,6], k = 3, target = 8
Output: [[1,3,4]]
解法1:DFS
代码如下:
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) {
sort(A.begin(), A.end());
vector<int> sol;
helper(A, sol, k, 0, target);
return solutions;
}
private:
vector<vector<int>> solutions;
void helper(vector<int> &A, vector<int> &sol, int k, int index, int target) {
if (sol.size() == k && target == 0) {
solutions.push_back(sol);
return;
}
if (sol.size() >= k || target < 0) return;
for (int i = index; i < A.size(); ++i) {
if (A[i] > target) return;
sol.push_back(A[i]);
helper(A, sol, k, i + 1, target - A[i]);
sol.pop_back();
}
}
};
二刷:
注意:
- subset问题如果输出结果不需要字典序,那么不需要事先sort。
- helper()里面用&sol和sol都可以,但&sol更快,sol会每次都生成vec的一个临时拷贝,太慢。对于sols,必须用&sols。
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
* we will sort your return value in output
*/
vector<vector<int>> kSumII(vector<int> &a, int k, int target) {
vector<int> sol;
vector<vector<int>> sols;
helper(a, k, target, 0, 0, sol, sols);
return sols;
}
private:
void helper(vector<int> &a, int k, int target, int pos, int sum, vector<int> &sol, vector<vector<int>> &sols) {
if (sol.size() == k && sum == target) {
sols.push_back(sol);
return;
}
for (int i = pos; i < a.size(); i++) {
sol.push_back(a[i]);
helper(a, k, target, i + 1, sum + a[i], sol, sols);
sol.pop_back();
}
return;
}
};
解法2:背包问题解法。