LintCode 90: k Sum II (DFS经典题)

  1. 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();
        }
        
    }
};

二刷:
注意:

  1. subset问题如果输出结果不需要字典序,那么不需要事先sort。
  2. 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:背包问题解法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值