程式語言 - LeetCode - C - 216. Combination Sum III



參考資訊:
https://www.cnblogs.com/grandyang/p/4537983.html

題目:


解答:

#define MAX_SIZE 1000

int dfs(int k, int n, int pos, int *tbuf, int tlen, int **rbuf, int *rlen)
{
    int cc = 0;

    if (tlen == k) {
        for (cc = 0; cc < k; cc++) {
            n -= tbuf[cc];
        }

        if (n == 0) {
            memcpy(rbuf[*rlen], tbuf, sizeof(int) * k);
            *rlen += 1;
        }

        tlen -= 1;
        return 0;
    }

    for (cc = pos + 1; cc <= 9; cc++) {
        tbuf[tlen] = cc;

        tlen += 1;
        dfs(k, n, cc, tbuf, tlen, rbuf, rlen);
        tlen -= 1;
    }

    return 0;
}

/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
int** combinationSum3(int k, int n, int *returnSize, int **returnColumnSizes)
{
    int cc = 0;
    int len = 0;
    int **rbuf = NULL;
    int tbuf[32] = { 0 };

    rbuf = malloc(sizeof(int *) * MAX_SIZE);
    for (cc = 0; cc < MAX_SIZE; cc++) {
        rbuf[cc] = malloc(sizeof(int) * k);
        memset(rbuf[cc], 0, sizeof(int) * k);
    }

    len = 0;
    dfs(k, n, 0, tbuf, 0, rbuf, &len);

    *returnSize = len;
    *returnColumnSizes = malloc(sizeof(int) * len);
    for (cc = 0; cc < len; cc++) {
        (*returnColumnSizes)[cc] = k;
    }

    return rbuf;
}