002.组合|||——回溯算法

news2024/11/27 8:24:45

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<vector<int>> result; // 存放结果集
vector<int> path; // 符合条件的结果

接下来还需要如下参数:

  • targetSum(int)目标和,也就是题目中的n。
  • k(int)就是题目中要求k个数的集合。
  • sum(int)sum在单层搜索中可以积攒path的和,用于终止条件和targetSun作对比,看看满不满足条件
  • startIndex(int)为下一层for循环搜索的起始位置。
vector<vector<int>> result;
vector<int> 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调整startIndex
    sum -= i; // 回溯
    path.pop_back(); // 回溯
}

2.4.总代码:

class Solution {
private:
    vector<vector<int>> result; // 存放结果集
    vector<int> 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调整startIndex
            sum -= i; // 回溯
            path.pop_back(); // 回溯
        }
    }

public:
    vector<vector<int>> 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.记录:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/42286.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大话游戏循环Game Loop——PythonC++

目录 前言 什么是游戏循环&#xff1f; 游戏循环的意义 从结构上来看&#xff1a; 从功能上来看&#xff1a; 正文 一个简单的游戏循环 阻塞游戏循环 现代基础游戏循环 “时间” 固定帧率游戏循环 时间驱动不固定帧率游戏循环 灵活帧率更新 之后的新问题 总结 …

网络基础—网关、网段、子网掩码

接上个笔记&#xff0c;工作时发现看似在一个网段的2个IP地址却ping不通&#xff0c;这里就是子网掩码发挥了作用。 IP地址 首先从最熟悉的IP地址开始介绍&#xff0c;IP地址是唯一标识&#xff0c;由32个0和1构成&#xff0c;长度为32bit&#xff0c;如00001010000000000000…

序列模型之循环神经网络(二)

目录 一.语言模型和序列生成 二.新序列采样 三.带有神经网络的梯度消失 四.GRU单元 一.语言模型和序列生成 上图的例子就是咱们的手机上的语音转文字输入差不多&#xff0c;说一句话&#xff0c;可能有多种可能的句子&#xff0c;那么到底是哪一种呢&#xff0c;咱们的语言…

【EDA365电子论坛】硬件人经历南下、北上,回乡创业,后悔了吗?

南下&#xff1f;北上&#xff1f;留下来&#xff1f;亦或是回乡&#xff1f;这些问题或许是每个电子人都曾遇到过的&#xff0c;如果可以&#xff0c;谁不想留在自己所熟悉的地方呢&#xff0c;但生活&#xff0c;总会让你想要的更多&#xff0c;只能选择再前行一步。 前几天在…

LeetCode题目笔记——2486. 追加字符以获得子序列

文章目录题目描述题目难度——中等方法一&#xff1a;一次遍历代码/C总结这个是上周末的周赛题目&#xff0c;当时忘做了&#xff0c;晚上的时候才想起&#xff0c;可惜了&#xff0c;题目还挺有意思的&#xff0c;类似的好像在以前做过&#xff0c;题目联机在这题目链接 题目…

你好,法语!A2知识点总结(4)

4.固定表达 4.1 devoir faire 4.2 ne…que ne…que&#xff1a;只…,仅仅 注意 用ne…que替换句子 Ex : En ce moment, il mange surtout des crales. En ce moment, il ne mange que des crales. 1)Elle lit surtout des romans. Il fait surtout du tennis.Ils s’intres…

NeRF算法Keras实现教程

在这个教程中&#xff0c;我们展示了 Ben Mildenhall 等人的研究论文 NeRF&#xff1a;将场景表示为用于视图合成的神经辐射场的最小实现。作者提出了一种巧妙的方法&#xff0c;通过神经网络对体积场景函数进行建模来合成场景的新颖视图。 为了帮助你直观地理解这一点&#x…

Mac下adb性能测试实战

本次实验以Editor App为例 1.测试Editor启动时长 打开终端&#xff0c;依次输入如下命令&#xff1a; adb devices 查看设备是否连接 adb shell 进入手机系统 adb devices pm list package -f | grep vidma 获取Editor包名 dumpsys package vidma.video.editor.video…

[glacierctf 2022] 只会3个

目录 Crypto CryptoShop 完成 Strange Letters Simple Crypto ChaCha60 Unpredictable Misc The Climber Size Matters ClipRipStage1 pwn Break the Calculator old dayz File-er rev Whats up Sandboxer 这个比赛完事后马上关网站。想复现都困难。会的不…

【宝塔面板安装与配置、Redis安装与配置、MySQL安装与配置】

提示&#xff1a;宝塔面板下载地址&#xff1a;https://www.bt.cn/new/download.html 文章目录前言一、快速迁移二、设置固定ip一.保证可以连接网络二.设置固定ip三、搭建宝塔面板四、做好备份五、安装Redis六、安装MySQL一、8.0版本以下二、8.0版本以上三、安全组开放端口四、…

GitHub上最全的Java面试题库竟还要收费?黑客强行开源后遭起诉

“金三银四”、“金九银十” 一直被称为是跳槽的旺季&#xff0c;最近也有不少小伙伴找我咨询一些面试相关的问题。但是我的建议是跳槽之前先想清楚自己为什么要跳槽&#xff0c;不要看到身边的同事跳槽之后薪资涨了不少&#xff0c;没有做好充分的准备就盲目开始投简历去面试。…

最新版 Cesium(1.99.0) 构建封装开发环境以及遇到问题

最新版 Cesium&#xff08;1.99.0&#xff09; 构建封装开发环境以及遇到问题使用版本Webpack4.* 集成 Cesium 错误官方示例介绍官方示例配置介绍&#xff1a;官方示例配置补充&#xff1a;webpack5 过程学习资料githup 完整项目最近项目用 Cesium 比较多&#xff0c;因此想把常…

世界各国GDP相关面板数据(1960-2019年)

1、数据来源&#xff1a;世界银行 2、时间跨度&#xff1a;1960-2019年 3、区域范围&#xff1a;全球 4、指标说明&#xff1a; 该数据包含以下指标&#xff1a; 1.世界各国1960-2019年GDP 2.世界各国1960-2019年GDP增长率 3.世界各国1960-2019年人均GDP 4.世界各国196…

SwiftUI 精品源码之学习可视化应用程序基于SceneKit,AVSpeechSynthetizer 文字转语音功能tts(教程)

我是一个非常注重视觉的人,这也适用于我的学习。当他们做某些事情时,我通过观察事物或其他人来学习。我也有很强的听觉倾向,所以你不能指望我读完一本 300 页的小说,但你可以指望我听 1 小时的播客而不会分心,并从中真正学到一些东西。 这种学习方式时常帮助我,从一门学科…

龙蜥开发者说:开源是场马拉松!来自广州大学姚同学的开源成长记 | 第 13 期

「龙蜥开发者说」第 13 期来了&#xff01;开发者与开源社区相辅相成&#xff0c;相互成就&#xff0c;这些个人在龙蜥社区的使用心得、实践总结和技术成长经历都是宝贵的&#xff0c;我们希望在这里让更多人看见技术的力量。本期故事&#xff0c;我们邀请了龙蜥社区开发者姚胤…

远程兴起,前端音视频通话?学

前言 看到前两篇文章都非常受欢迎&#xff0c;加起来有一千多赞了&#x1f44d;&#x1f3fb; &#xff0c;非常的开心&#xff01;&#x1f916;继续加油&#xff01;冲&#xff01; 我们在前两篇文章中大概讲解了 音视频媒体流的获取&#xff0c;处理&#xff0c;以及在上一…

(免费分享)基于jsp的CRM客户管理-带论文

一、课题来源&#xff1a; 自有商业活动&#xff0c;客户关系就一直是商业活动中的一个核心问题&#xff0c;同时也成了商务活动成功的审核标准。在全球经济一体化为时代背景的时代&#xff0c;企业面临着为公司带来更多的客户、为管理者提供准确的信息和便捷的操作查询手段 、…

新旧iphone短信转移,苹果旧手机短信导入新手机

短信携带重要信息内容&#xff0c;新旧iphone短信转移&#xff1f;您可能知道&#xff0c;iOS设备上不支持导出iPhone简讯&#xff0c;更不用说打印iPhone上的短信了。幸运的是&#xff0c;有一些可行的方法可以将iPhone短信导入到另一个iPhone&#xff0c;继续阅读以获得更多帮…

软件协会第01次活动第05次任务布置:爱心代码+演奏歌曲+typora使用pandoc导出+github注册登录+函数练习+写csdn文章

了解更多关注软协官网&#xff1a;https://www.csuftsap.cn/ 来自软件协会编辑&#xff0c;注册会员即可获取全部开源.md资源&#xff0c;请勿转载&#xff0c;归软件协会所有。 文章目录:star: 软件协会第01次活动第05次任务布置1.程序员的浪漫-爱心代码&#xff08;升级版&a…

css3手册

文章目录布局弹性盒生成弹性容器和弹性项目更改方向主轴排列侧轴排列弹性项目伸缩主轴换行网格生成网格布局定义行和列改变排列方向单元格之间的间隙单元格内部的对齐网格项目定位视觉阴影盒子阴影文字阴影圆角背景渐变变形translate 平移scale 缩放rotate 旋转改变变形原点多种…