首页 > 编程语言 >[回溯算法]leetcode40. 组合总和 II(c实现)

[回溯算法]leetcode40. 组合总和 II(c实现)

时间:2022-11-13 10:01:33浏览次数:49  
标签:target int sum II 树层 candidates 回溯 sizeof leetcode40

题目

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意:解集不能包含重复的组合。  示例 1: 输入: candidates = [10,1,2,7,6,1,5], target = 8, 输出: [ [1,1,6], [1,2,5], [1,7], [2,6] ] 示例 2: 输入: candidates = [2,5,2,1,2], target = 5, 输出: [ [1,2,2], [5] ]  

代码

/**
 * 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 *path;
 int pathTOP;
 int **ans;
 int  ansTOP;
 int *length;
 void backtracking(int*candidates,int candidatesSize,int target,int sum,int startindex)
 {
     int i=0;
     if(sum>target)
     {
         return ;
     }
     //递归终止条件
     if(sum==target)
     {
        int*temp=(int*)malloc(sizeof(int)*pathTOP);
        for(i=0;i<pathTOP;i++)
        {
          temp[i]=path[i];
        }
         ans[ansTOP]=temp;
         length[ansTOP++]=pathTOP;
         return ;
     }
     for(i=startindex;i<candidatesSize;i++)
     {
         if(i>startindex&&candidates[i-1]==candidates[i])
         //判断是否用于去重,若为树层则需去重
         {
             continue;
         }
         path[pathTOP++]=candidates[i];
         sum+=candidates[i];
         backtracking(candidates,candidatesSize,target,sum,i+1);
         //回溯
         sum-=candidates[i];
         pathTOP--;
     }
 }
 int cmp(const void*e1,const void*e2)
 {
     return *((int*)e1)-*((int*)e2);
 }
int** combinationSum2(int* candidates, int candidatesSize, int target, int* returnSize, int** returnColumnSizes){
      path=(int*)malloc(sizeof(int)*50);
      ans=(int**)malloc(sizeof(int*)*200);
      length=(int*)malloc(sizeof(int)*200);
      pathTOP=0;
      ansTOP=0;
      int sum=0;//用于记录取值的加和,与traget判断
      int startindex=0;//用于记录起始位置
      qsort(candidates,candidatesSize,sizeof(int),cmp);
      backtracking(candidates,candidatesSize,target,sum,startindex);
      *returnSize=ansTOP;
      //记录每个集合中的大小
      *returnColumnSizes=(int*)malloc(sizeof(int)*ansTOP);
      int i=0;
      for(i=0;i<ansTOP;i++)
      {
          (*returnColumnSizes)[i]=length[i];
      }
       return ans;
}

过程

1.为什么要有去重操作

若不包括去重操作,那也就没有排序操作 image.png 因为组合是不分顺序的,所以像出现的 1 2 5 与 2 1 5实际是表示一个组合

2.分辨树层重复还是树层与树枝重复

这里以 1 1 2为例 我们要区分是树层的重复还是 树层与树枝的重复 image.png

这里产生了两个 1 2 组合 第一个 1 2 组合: image.png 先在树层中取1,for循环中剩下 1 2 ,进入递归中,取树枝的1 这种 即为树层与树枝的重复 ,即便是两者值相同也不用去重

第二个 1 2 组合: image.png 取树层的1后,发现再次进入for循环中,i=2,startindex仍等于1 i>startindex 同时 两者值相同 即判断树层中重复,需要去重

3.递归展开图

image.png

标签:target,int,sum,II,树层,candidates,回溯,sizeof,leetcode40
From: https://blog.51cto.com/u_15787387/5847692

相关文章

  • [回溯算法]leetcode216. 组合总和 III(c实现)
    题目找出所有相加之和为 n的 k 个数的组合,且满足下列条件:只使用数字1到9每个数字 最多使用一次 返回所有可能的有效组合的列表。该列表不能包含相同的组合两次......
  • 使用Field_II_ver_3_24_windows_gcc工具箱实现超声波数据成像matlab仿真
    目录​​一、理论基础​​​​二、核心程序​​​​三、测试结果​​​​FPGA教程目录​​​​MATLAB教程目录​​一、理论基础​​FieldIIUltrasoundSimulationProgram......
  • ASP.NET Core教程-Configuration(配置)-配置IIS配置(IIS integration)
    更新记录转载请注明出处:2022年11月12日发布。2022年11月8日从笔记迁移到博客。配置IIS配置(IISintegration)默认情况下,ASP.NETCore应用程序是自托管的如果我们......
  • 回溯算法解数独问题
    好久没写算法了,浅解个数独本篇代码以伪代码为主,主要讲解解题思路规则介绍:首先数独的游戏规则,每个九宫格每一行每一列每个数字只能出现一次(1-9)开局时会生成一些不......
  • Conclusion(II)
    HidingDatefromOhters信息安全的CIA三要素:Confidentiality(保密性)Integrity(完整性)Availability(可用性)Plaintext(明文)是指待加密的信息Ciphertext(密文)是明文加密......
  • 使用Field_II_ver_3_24_windows_gcc工具箱实现超声波数据成像matlab仿真
    目录一、理论基础二、核心程序三、测试结果FPGA教程目录MATLAB教程目录一、理论基础FieldIIUltrasoundSimulationProgram关于Field_II_ver_3_24_windows_gcc......
  • 回溯算法dfs: lc46全排列 lc47全排列ll
    result=[] defbacktrack(路径,选择列表):if满足结束条件:result.add(路径)returnfor选择in选择列表:做选择backtrack(路径,选择列表)撤销选择 46全......
  • Yii2-Queue实现轻量级消息队列
    概述Yii2-Queue是Yii2官方制作的一个消息队列,提供多个缺点:Syncronous,File,DB,Redis,RabbitMQ,AMQPInterop,Beanstalk,Gearman等,使用Yii2开发的时候使用该扩展......
  • ASP.Net Core Web 在IIS下的发布流程
    1.新建项目,选择Asp.NETWeb应用程序2.选择Web应用程序(模型视图控制器)3.鼠标右键项目,选择【发布】4.选择【IIS、FTP等】5.发布方法选择【文件......
  • [oeasy]python0013_ASCII码表_英文字符编码_键盘字符
    ASCII码表回忆上次内容​ord(c)​​和​​chr(i)​这是俩函数这俩函数是一对,相反相成的⚖️​​ord​​通过​​字符​​找到对应的​​数字​​​​chr​​通过​​......