《LeetCode之每日一题》:93.组合总和
Posted 是七喜呀!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LeetCode之每日一题》:93.组合总和相关的知识,希望对你有一定的参考价值。
题目链接: 组合总和
有关题目
给定一个无重复元素的数组 candidates 和一个目标数 target
找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
示例 1:
输入:candidates = [2,3,6,7], target = 7,
所求解集为:
[
[7],
[2,2,3]
]
示例 2:
输入:candidates = [2,3,5], target = 8,
所求解集为:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
提示:
1 <= candidates.length <= 30
1 <= candidates[i] <= 200
candidate 中的每个元素都是独一无二的。
1 <= target <= 500
题解
法一:回溯
/**
* 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 candidatesSize_tmp;//后续要改变candidatesSize,备份
int ansSize;
int combineSize;
int* ansColumnSize;
void dfs(int* candidates, int target, int** ans, int* combine, int idx)
{
//递归结束条件之一
if (idx == candidatesSize_tmp) {
return;
}
//递归结束条件之二
if (target == 0) {
int* tmp = malloc(sizeof(int) * combineSize);
for (int i = 0; i < combineSize; ++i) {
tmp[i] = combine[i];
}
ans[ansSize] = tmp;//数组指针,将tmp这个数组的地址传给下标为ansSize的ans中的元素
ansColumnSize[ansSize++] = combineSize;//更新指针数组ans的列数
return;
}
// 直接跳过
dfs(candidates, target, ans, combine, idx + 1);
// 选择当前数,并且下标不发生改变
if (target - candidates[idx] >= 0) {
combine[combineSize++] = candidates[idx];
//由于选元素的个数无限制 选择当前数,并且下标不发生改变
dfs(candidates, target - candidates[idx], ans, combine, idx);
combineSize--;//防止组合污染,拿去最后一个元素
}
}
int cmp(int *a, int *b) {
return *a > *b;
}
int** combinationSum(int* candidates, int candidatesSize, int target, int* returnSize, int** returnColumnSizes){
//剪枝 qsort(candidates,candidatesSize,sizeof(int),cmp);
candidatesSize_tmp = candidatesSize;
ansSize = combineSize = 0;//ans的行数ansSize,与当前构成数字组合大小初始化
int** ans = malloc(sizeof(int*) * 1001);//开辟ans,返回值二级指针
ansColumnSize = malloc(sizeof(int) * 1001);//ans的列数
int combine[2001];//开辟组合数组
//回溯,在candidates中第0位,还剩target要组合,当前的组合数组为combine,当前的答案数组指针为ans
//target <= 0,或者到了第candidatesSize位我们结束递归
dfs(candidates, target, ans, combine, 0);
*returnSize = ansSize;
*returnColumnSizes = ansColumnSize;
return ans;
}
以上是关于《LeetCode之每日一题》:93.组合总和的主要内容,如果未能解决你的问题,请参考以下文章