002.组合总和|||——回溯算法
创始人
2024-02-27 14:07:44
0

1.题目链接:

216. 组合总和 III

2.解题思路:

2.1.题目要求:

给一个元素数量k和一个元素和n,要求从范围[1,2,3,4,5,6,7,8,9]中返回所有元素数量为k和元素和为n的组合。(每个数字只能使用一次)

比如输入k=3,n=7,得[1,2,4]

2.2.思路:

模拟成一个n叉树,用for循环里递归的方式,完成层层遍历,终止条件变成满足元素数量为k和元素和为n就返回就好了。

2.3.回溯三部曲:

2.3.1.确定递归函数参数

需要一维数组path来存放符合条件的结果,二维数组result来存放结果集。

vector> result; // 存放结果集
vector path; // 符合条件的结果

接下来还需要如下参数:

  • targetSum(int)目标和,也就是题目中的n。
  • k(int)就是题目中要求k个数的集合。
  • sum(int)sum在单层搜索中可以积攒path的和,用于终止条件和targetSun作对比,看看满不满足条件
  • startIndex(int)为下一层for循环搜索的起始位置。
vector> result;
vector path;
void backtracking(int targetSum, int k, int sum, int startIndex)

2.3.2.确定终止条件

满足元素数量为k和元素和为n就返回,这里有个隐藏起来的操作,sum不等于targeSum会直接返回。

if (path.size() == k) {if (sum == targetSum) result.push_back(path);return; // 如果path.size() == k 但sum != targetSum 直接返回
}

2.3.3.单层搜索的过程

单层搜索,for里面套递归,遍历每一条路径(如下“2.2.思路”下面图片的红色箭头),在递归路径的途中用sum搜集path上每一段的值,用于终止条件。

for (int i = startIndex; i <= 9; i++) {sum += i;path.push_back(i);backtracking(targetSum, k, sum, i + 1); // 注意i+1调整startIndexsum -= i; // 回溯path.pop_back(); // 回溯
}

2.4.总代码:

class Solution {
private:vector> result; // 存放结果集vector path; // 符合条件的结果// targetSum:目标和,也就是题目中的n。// k:题目中要求k个数的集合。// sum:已经收集的元素的总和,也就是path里元素的总和。// startIndex:下一层for循环搜索的起始位置。void backtracking(int targetSum, int k, int sum, int startIndex) {if (path.size() == k) {if (sum == targetSum) result.push_back(path);return; // 如果path.size() == k 但sum != targetSum 直接返回}for (int i = startIndex; i <= 9; i++) {sum += i; // 处理path.push_back(i); // 处理backtracking(targetSum, k, sum, i + 1); // 注意i+1调整startIndexsum -= i; // 回溯path.pop_back(); // 回溯}}public:vector> combinationSum3(int k, int n) {result.clear(); // 可以不加path.clear();   // 可以不加backtracking(n, k, 0, 1);return result;}
};

3.剪枝优化

3.3.思路:

3.3.1.总和大于n剪枝。

已选元素总和如果已经大于n了,那么往后遍历就没有意义了,直接剪掉。(在终止条件那加上)

 代码如下:

if (sum > targetSum) { // 剪枝操作return;
}

3.3.2.已选元素数量+可选元素数量 < 题目需要的元素数量 k 剪枝。

代码如下:

for (int i = startIndex; i <= n - (k - path.size()) + 1; i++) { // 优化的地方

 (忘记怎么来的可以去001.组合看)

4.记录:

不该早上开游戏的,一出现事情很消耗精力,休息时间再回复消息(除非我去问的),不然老是分心。

相关内容

热门资讯

董明珠硬刚空调“铝代铜”!海尔... 买空调时,你会特意问一句“是铜管还是铝管”吗?近日,海尔、美的、小米等主流家电品牌宣布,将联合推动空...
兄弟科技:诉讼仍处审理阶段无实... 证券之星消息,兄弟科技(002562)12月22日在投资者关系平台上答复投资者关心的问题。 投资者提...
免费停车延至30分钟!《烟台市... 大众网记者 崔荔媛 烟台报道 12月22日,烟台市人民政府新闻办公室召开新闻发布会,宣布《烟台市停车...
国网吉林经研院完成能源电力主要... 12月15日,国网吉林经研院顺利完成能源电力领域主要政策的系统性梳理与汇编工作。该项工作旨在全面整合...
赖清德弹劾案最新进展:台立法机... 中国台湾网12月22日讯 据台媒报道,因民进党当局“不副署、不执行”台立法机构三读修正通过的“财划法...
再现“拉车门”盗窃案,库伦警方... 12月18日 库伦旗公安局 成功破获一起“拉车门”盗窃案 抓获2名犯罪嫌疑人 12月17日 库伦镇...
诉前调解化干戈跨省纠纷当庭了 近日,紫云苗族布依族自治县人民法院板当人民法庭高效化解一起跨省恋爱期间财物返还纠纷,从组织调解到履行...
一中国女子在欧洲邮轮旅行失联超... 12月21日,据媒体报道:一名中国女性乘客在爱达月光号(AIDAluna)邮轮上失踪,引发多国关注。...
原创 高... 当今复杂的国际政治舞台上,日本军国主义复苏的论调日益凸显,引发国际社会广泛警惕。高市早苗就任日本首相...