# 77. Combinations 題目:<https://leetcode.com/problems/combinations/> 解法:backtracking,依序由小到大放入數字,放滿後記錄,接著往回前一個繼續放入其他數字,直到所有數字都放完。 Python3: ``` python 3 class Solution: def combine(self, n: int, k: int) -> list[list[int]]: def backtrack(step): if step == k: output.append(list(cur)) return for num in range(cur[-1]+1, n+1): cur.append(num) backtrack(step + 1) cur.pop() output = [] for num in range(1, n+1): cur = [num] backtrack(1) return output if __name__ == '__main__': n = 4 k = 2 ans = Solution().combine(n, k) print(ans) ``` C: ``` c #include <stdio.h> #include <stdlib.h> int** combine(int n, int k, int* returnSize, int** returnColumnSizes) { *returnSize = 1; for (int i = 1; i <= k; i++) { *returnSize *= (n - k + i); *returnSize /= i; } int ** output = (int**)malloc(sizeof(int*) * (*returnSize)); *returnColumnSizes = (int*)malloc(sizeof(int) * (*returnSize)); for (int i = 0; i < (*returnSize); i++) { (*returnColumnSizes)[i] = k; output[i] = (int*)malloc(sizeof(int) * k); } int count = 0; int cur[k]; void backtrack(int step) { if (step == k) { for (int i = 0; i < k; i++) output[count][i] = cur[i]; count++; return; } for (int num = cur[step-1]+1; num <= n; num++) { cur[step] = num; backtrack(step + 1); } } for (int num = 1; num <= n; num++) { cur[0] = num; backtrack(1); } return output; } int main() { int n = 4, k = 2; int returnSize; int *returnColumnSizes; int ** ans = combine(n, k, &returnSize, &returnColumnSizes); printf("%d\n", returnSize); for (int i = 0; i < returnSize; i++) { printf("%d: ", returnColumnSizes[i]); for (int j = 0; j < returnColumnSizes[i]; j++) printf("%d ", ans[i][j]); printf("\n"); } return 0; } ``` ###### tags: `leetcode` `backtracking`