K sum

Two sum 作为一个入门题,之后有3sum,4sum这样的,逐步升级为k sum. 两种问题,一种是求所有解,一种是求解的个数。前者就是backtracking,后者dp。下面来讨论下这两种题的解法。 Given n unique integers, number k (1<=k<=n) and target. Find all possible k integers where their sum is target. 这个暴力解法是O(C(N, K))就是n个数中取k个,求和看是否满足,满足就加入结果集,类似combination sum那道题。这个时间复杂度是O(min(n^k, n^(n-k)))。目前所知的最优解是O(N^(k-1)).
这里有个人的blog写的很详细了,我觉得我就不用再抄一遍了。ksum总结
第二种dp问题,看了一下答案,抱歉,完全不明白,三维dp,真的是超出了我的能力范围。把代码贴上,有兴趣的请自行观瞻。

public int  kSum(int A[], int k, int target) {
    int n = A.length;
    int[][][] f = new int[n + 1][k + 1][target + 1];
    for (int i = 0; i < n + 1; i++) {
        f[i][0][0] = 1;
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= k && j <= i; j++) {
            for (int t = 1; t <= target; t++) {
                f[i][j][t] = 0;
                if (t >= A[i - 1]) {
                    f[i][j][t] = f[i - 1][j - 1][t - A[i - 1]];
                }
                f[i][j][t] += f[i - 1][j][t];
            } // for t
        } // for j
    } // for i
    return f[n][k][target];
}

results matching ""

    No results matching ""