当前位置: 首页 > article >正文

组合总和III(力扣216)

这道题在回溯的基础上加入了剪枝操作。回溯方面我就不过多赘述,与组合(力扣77)-CSDN博客 大差不差,主要讲解一下剪枝(下面的代码也有回溯操作的详细注释)。我们可以发现,如果我们递归到后面,可能集合过小,无法满足题目要求的k个数的组合,为了保证我们一定可以找到k个数的组合,在for循环中遍历当前集合时,要控制选取元素的边界在哪。就是说我们不能选到集合中太靠后的元素,这会导致递归的子集过小,无法选出k个数的组合。另外,当我们选出来的数字已经大于目标和时,可以直接退出递归,这也是一种剪枝。大家可以结合我下面的代码及注释理解此题。

代码及注释如下:

class Solution {
public:
  //创建全局变量存储结果
    vector<int> path;//存储一个组合
    vector<vector<int>> result;//存储所有满足条件的组合
    void backtracking(int k,int n,int startIndex,int sum){
        //剪枝1:如果和已经大于目标和,可以直接退出递归
        if(sum > n){
            return;
        }
        //终止条件:找到k个数的组合,则退出递归
          if(path.size() == k){
            if(sum == n){
                result.push_back(path);
                return;
            }
            return;
          }
          //遍历当前集合的各个数字
          //剪枝2:如果集合中的数过少,就无法满足组合为k个数,根据这个条件找到每一层递归i的临界处
          for(int i = startIndex;i <= 9 - (k - path.size()) + 1;i++){
            sum += i;
            path.push_back(i);
            //递归更小的集合
            backtracking(k,n,i + 1,sum);
            //回溯操作
            path.pop_back();
            sum -= i;
          }
    } 
    vector<vector<int>> combinationSum3(int k, int n) {
        backtracking(k,n,1,0);
        return result;
    }
};


http://www.kler.cn/a/534925.html

相关文章:

  • gc buffer busy acquire导致的重大数据库性能故障
  • 算法日记12:SC40树状数组(单点修改)
  • 仿LISP运算
  • “AI隐患识别系统,安全多了道“智能护盾”
  • MySQL
  • ollama部署deepseek实操记录
  • 腾讯社招流程记录
  • eclipse memory analyzer(mat)使用笔记
  • Yageo国巨的RC系列0402封装1%电阻库来了
  • 【OpenCV实战】混合运动跟踪算法的视频目标轨迹可视化系统设计与实现
  • 10. 神经网络(二.多层神经网络模型)
  • 面试题-SpringCloud的启动流程
  • 使用 Ollama 在腾讯云服务器环境部署 DeepSeek 大模型实战指南
  • Linux详细讲解
  • 【新手上路】洛谷算法1-1:模拟与高精度(高精度部分)
  • 2.07 算法练习
  • 硅基流动与华为云联合推出基于昇腾云的DeepSeek R1amp;V3推理服务
  • 宏观经济:信贷紧缩与信贷宽松、通货膨胀与通货紧缩以及经济循环的四个周期
  • 【分布式理论六】分布式调用(4):服务间的远程调用(RPC)
  • 网站服务器如何御防恶意网络爬虫攻击?
  • ALU与寄存器设计与运算优化
  • graylog初体验
  • iOS 音频录制、播放与格式转换
  • Linux常见问题解决方法--2
  • k8s中,一.pod污点,二.pod容器污点容忍策略,三.pod优先级(PriorityClass类)
  • 深度学习 | 表示学习 | 卷积神经网络 | Batch Normalization 在 CNN 中的示例 | 20