题目
- 组合
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
你可以按 任何顺序 返回答案。
示例 1:
输入:n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
示例 2:
输入:n = 1, k = 1
输出:[[1]]
提示:
1 <= n <= 20
1 <= k <= n
思路
利用回溯的思想,通过递归实现。定义一个指针并开辟空间来储存组合的可能,再定义一个二级指针来存储每种组合的地址。当存储的值组成一个组合时,将其存储起来,然后再回溯到上个状态(即改变最后一个储存值)来组成新的组合,直到所有的组合被完成。当剩余的值无法组成新组合时或者是每组成一个新组合时返回,以达到回溯效果。
代码
/**
* 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 *temp;
int tempsize;
int **ans;
int anssize;
int dfs(int cur,int n,int k){
if(tempsize+n-cur+1<k){
return;
}
if(tempsize==k){
int*tmp=(int*)malloc(sizeof(int)*k);
for(int i=0;i<k;i++){
tmp[i]=temp[i];
}
ans[anssize++]=tmp;
return;
}
temp[tempsize++]=cur;
dfs(cur+1,n,k);
tempsize--;
dfs(cur+1,n,k);
}
int** combine(int n, int k, int* returnSize, int** returnColumnSizes){
temp=(int*)malloc(sizeof(int)*k);
ans=(int*)malloc(sizeof(int*)*10005);
tempsize = anssize = 0;
dfs(1,n,k);
*returnSize=anssize;
*returnColumnSizes=(int*)malloc(sizeof(int)*anssize);
for(int i=0;i<anssize;i++){
(*returnColumnSizes)[i]=k;
}
return ans;
}