回溯解决组合总和问题——leetcode216

题:找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

思路:相对于回溯算法的组合问题77多了一个限制,即找到和为n的k个数的组合,而整个集合已经是固定的了[1,…,9]。

回溯三要素:

  • 返回值和参数: void
    参数:同组合问题,需要一个二维数组存放结果集合,和一个一维数组存放符合条件的结果。
vector<vector<int>> result;
vector<int> path;

此时还需要一个目标总和targetSum,一个已经存放的数path的和sum,数的个数k,遍历的起始位置startIndex,即

int targetSum;
int sum;
int k;
int startIndex;
void backtracking(int targetSum, int k, int sum, int startIndex)
  • 终止条件:即当path的大小等于k时,停止,且path的和等于targetSum时终止。即
if(path.size()==K){
   if(sum==targetSum)
     result.push_back(path);
      return;
}
  • 单层搜索逻辑:处理过程就是 path收集每次选取的元素,相当于树型结构里的边,sum来统计path里元素的总和,for循环中i<=9。即
for(int i=startIndex;i<=9;i++){
     sum +=i;
     path.push_back(i);
     backtracking(targetSum,k,sum,i+1);
     sum -=i;
     path.pop_back();
}
  • 最后,就是主函数调用回溯算法,将参数填进去即可。
public:
    vector<vector<int>> combinationSum3(int k, int n) {
        backtracking(n, k, 0, 1);
        return result;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值