栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

LeetCode刷题笔记-39.组合总和

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode刷题笔记-39.组合总和

LeetCode刷题笔记-39.组合总和
  • C语言
    • 注意点
    • 结果
  • 题目

C语言
void dfs(int *nums, int numsSize, int *cs, int sum, int ***ret, int *returnSize, int **colSize, int curi) {
  int i;
  
  if (sum < 0) {
    return;
  }
  
  if (sum == 0) {
    int tcs = 0;
    int tail = 0;
    int j;
    int ci = 0;
    //TODO 遍历所有数量
    for (i = 0; i < numsSize; i++) {
      tcs += cs[i];
    }
    //开辟list空间 cols空间
    (*returnSize)++;
    tail = (*returnSize) - 1; 
    *ret = realloc(*ret, (*returnSize) * (sizeof(int *)));
    *colSize = realloc(*colSize, (*returnSize) * sizeof(int));
    (*ret)[tail] = calloc(tcs, sizeof(int));
    (*colSize)[tail] = tcs;
    //填值
    for (i = 0; i < numsSize; i++) {
      for (j = 0; j < cs[i]; j++) {
        (*ret)[tail][ci] = nums[i];
        ci++;
      }
    }
    return;
  }
  
  for (i = 0; i < numsSize; i++) {
    if (i < curi)
      continue;
    cs[i]++;
    dfs(nums, numsSize, cs, sum - nums[i], ret, returnSize, colSize, i);
    cs[i]--;
  }
  return;
}

int** combinationSum(int* nums, int numsSize, int target, int* returnSize, int** returnColumnSizes) {
  int **ret = NULL;
  int *cs = NULL;
  *returnSize = 0;
  ret = calloc(0, sizeof(int *));
  *returnColumnSizes = calloc(0, sizeof(int));
  
  cs = calloc(numsSize, sizeof(int));
  
  dfs(nums, numsSize, cs, target, &ret, returnSize, returnColumnSizes, 0);
  
  return ret;
}
注意点
  1. 回溯结束后记得把增加了的计数减1;
  2. 注意去掉重复项,如果每次都是全遍历,举个例子,如同用例1:会出现【2,2,3】【2,3,2】【3,2,2】会满足递归条件,所以本人在题解中加入了curi来控制重复情况;
结果

题目

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/862249.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号