[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();
        }
    }
};
posted @ 2021-01-11 21:55  与MPI做斗争  阅读(88)  评论(0编辑  收藏  举报