题目:
题解:
int** combine(int n, int k, int* returnSize, int** returnColumnSizes) {int* temp = malloc(sizeof(int) * (k + 1));int tempSize = 0;int** ans = malloc(sizeof(int*) * 200001);int ansSize = 0;// 初始化// 将 temp 中 [0, k - 1] 每个位置 i 设置为 i + 1,即 [0, k - 1] 存 [1, k]// 末尾加一位 n + 1 作为哨兵for (int i = 1; i <= k; ++i) {temp[i - 1] = i;}temp[k] = n + 1;int j = 0;while (j < k) {int* tmp = malloc(sizeof(int) * k);for (int i = 0; i < k; i++) {tmp[i] = temp[i];}ans[ansSize++] = tmp;j = 0;// 寻找第一个 temp[j] + 1 != temp[j + 1] 的位置 t// 我们需要把 [0, t - 1] 区间内的每个位置重置成 [1, t]while (j < k && temp[j] + 1 == temp[j + 1]) {temp[j] = j + 1;++j;}// j 是第一个 temp[j] + 1 != temp[j + 1] 的位置++temp[j];}*returnSize = ansSize;*returnColumnSizes = malloc(sizeof(int) * ansSize);for (int i = 0; i < ansSize; i++) {(*returnColumnSizes)[i] = k;}return ans;
}