代码随想录算法训练营:23/60

非科班学习算法day23 | LeetCode39:组合总和 ,Leetcode40:组合总和|| 


介绍

包含LC的两道题目,还有相应概念的补充。

相关图解和更多版本:

代码随想录 (programmercarl.com)https://programmercarl.com/#%E6%9C%AC%E7%AB%99%E8%83%8C%E6%99%AF


一、LeetCode题目

1.LeetCode39:组合总和 

题目链接:39. 组合总和 - 力扣(LeetCode)

题目解析

       明确问题需求,组合:没有顺序要求,可以有重复;总和:中止条件,剪枝条件。

这里和之前题目最大的区别就是可以重复,也就是说可以从头开始,所以注意递归的参数是i

        还有一个问题就是需不需要index,实际上是需要的,因为index可以帮助我们取寻找在一个数组中当前寻找元素的位置,比如说,一开始找的是0位,进入递归,下一层还是会从0开始选取;下一个for里面i已经++了,所以进入到1位的分支,以上这句话也可以增加对回溯的理解。

 c++代码如下:

class Solution {
public:// 路径vector<int> path;// 结果vector<vector<int>> res;// 回溯函数-重复选取void backtracking(vector<int>& candidates, int target, int index, int sum) {if (sum > target)return;// 中止,收集结果if (sum == target) {res.push_back(path);return;}for (int i = index; i < candidates.size(); i++) {path.push_back(candidates[i]);sum += candidates[i];backtracking(candidates, target, i, sum);path.pop_back();sum -= candidates[i];}}vector<vector<int>> combinationSum(vector<int>& candidates, int target) {backtracking(candidates, target, 0, 0);return res;}
};

 2.Leetcode40:组合总和|| 

题目链接:40. 组合总和 II - 力扣(LeetCode)

题目解析

       这里有一个和前面不同的区别就是数组中有重复的数字,结果res里面的路径之间要求不可以相同,比如[1,1,1]没有问题,但是res里有两个[1,1,1]就不可以了。

        明确了这个需求我们可以根据抽象的树状图分析出来,递归过程其实并没有影响,因为检索过程没有变,但是如果想去重就要把在树层上下功夫。这里没有采用used辅助,可以想象一下,什么能造成重复,前提是将数组排序,如果相邻两个数是一样的,因为我们for是从左到右遍历,那么后面的数构成的结果一定包含在前面的数里。

 C++代码如下: 

class Solution {
public:// 路径vector<int> path;// 结果vector<vector<int>> res;// 回溯函数-有重复数字且同一位不可重复选取void backtracking(vector<int>& candidates, int target, int sum, int index) {if (sum > target)return;// 收集结果if (sum == target) {res.push_back(path);return;}for (int i = index; i < candidates.size(); ++i) {if (i > index && candidates[i] == candidates[i - 1])continue;path.push_back(candidates[i]);sum += candidates[i];backtracking(candidates, target, sum, i + 1);path.pop_back();sum -= candidates[i];}}vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {sort(candidates.begin(), candidates.end());backtracking(candidates, target, 0, 0);return res;}
};

注意点:其他地方都没有问题,只需要注意去重大多数是要重新排序的,除非说有序返回

总结


打卡第23天,坚持!!!

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

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

相关文章

计算机的错误计算(二十五)

摘要 介绍&#xff08;不&#xff09;停机问题。给了一个算式&#xff0c;当计算机的输出为0时&#xff0c;一般需要提高计算精度继续计算&#xff0c;一直到获得非0值或有效数字。但是&#xff0c;由于事先不清楚算式的准确值是否为0或不为0&#xff0c;因此往往陷入两难境地…

java包装类。

包装类介绍 Java的包装类&#xff08;Wrapper Classes&#xff09;是Java语言为八种基本数据类型&#xff08;byte, short, int, long, float, double, char, boolean&#xff09;提供的对应类。这些包装类允许我们将基本数据类型当作对象来处理&#xff0c;并提供了许多有用的…

常见的网络协议在不同的模型中层次分布

常见的网络协议根据其功能和作用&#xff0c;分布在OSI七层参考模型或TCP/IP四层参考模型的不同层次中。以下是这些协议在不同模型中的层次分布&#xff1a; 在OSI七层参考模型中的层次分布 物理层&#xff1a; 这一层主要涉及物理连接的建立和物理信号的传输&#xff0c;但通…

【Java15】继承

继承是面向对象三大特征之一&#xff0c;也是软件代码服用的重要手段。 Java只允许单继承&#xff0c;即每个子类只有一个直接父类。 C中的多继承被Java舍弃了&#xff0c;原因是多继承一方面难以准确表述类之间的关系&#xff0c;另一方面很容易造成代码错误。总结起来就两个…

双系统ubuntu20.04扩容

windows端 打开磁盘管理器&#xff0c;选择需要的盘点击压缩卷 点击未分配的盘&#xff0c;新建简单卷&#xff0c;一致点击下一步即可&#xff0c;记住分配的大小容量 ubuntu端 lsblk 查看所有的磁盘&#xff0c;可以看到新增为nvme0n1p4、nvme1n1p2 win分配的格式为NTFS&a…

【Excel】 批量跳转图片

目录标题 1. CtrlA全选图片 → 右键 → 大小和属性2. 取消 锁定纵横比 → 跳转高度宽度 → 关闭窗口3. 最后一图拉到最后一单元格 → Alt吸附边框![](https://i-blog.csdnimg.cn/direct/d56ac1f41af54d54bb8c68339b558dd1.png)4. CtrlA全选图片 → 对齐 → 左对齐 → 纵向分布!…

全网最适合入门的面向对象编程教程:11 类和对象的Python实现-子类调用父类方法-模拟串口传感器和主机

全网最适合入门的面向对象编程教程&#xff1a;11 类和对象的 Python 实现-子类调用父类方法-模拟串口传感器和主机 摘要&#xff1a; 本节课&#xff0c;我们主要讲解了在 Python 类的继承中子类如何进行初始化、调用父类的属性和方法&#xff0c;同时讲解了模拟串口传感器和…

OpenHarmony 入门——单元测试UnitTest快速入门

引言 OpenHarmony 的单元测试&#xff08;UnitTest&#xff09;是一个关键的软件开发过程&#xff0c;它确保代码的各个部分能够按预期工作&#xff0c;OpenHarmony的测试框架中提供了很多种的单元测试&#xff0c;今天简单介绍下UnitTest 类型的TDD测试。 OpenHarmony 的TDD …

Nacos 国际化

项目需要&#xff0c;后端异常信息需要进行国际化处理。所有想有没有方便易用的可选项。 1、国际化配置调整&#xff0c;不需要重启系统 2、可支持添加不同或自定义语言包&#xff08;就是配置的资源文件&#xff09; 参考&#xff1a; Nacos实现SpringBoot国际化的增强_spr…

Android IP地址、子网掩码、默认网关、首选DNS服务器、备用DNS服务器校验

Android IP地址、子网掩码、默认网关、首选DNS服务器、备用DNS服务器校验 public String isIP(String ip) {String regex = "(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)){3}";Pattern p = Pattern.compile(regex)

LeetCode热题100刷题9:25. K 个一组翻转链表、101. 对称二叉树、543. 二叉树的直径、102. 二叉树的层序遍历

25. K 个一组翻转链表 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), nex…

uni-app + vue3项目引入unocss

使用方法&#xff1a;unocss 版本最好使用0.58&#xff0c;版本太高的话不兼容引入时会报错 在class中使用&#xff0c;如&#xff1a;class"w-full"

华为机考前准备工作

很多同学在刷完真题后&#xff0c;就直接去考试了&#xff0c;会发现不是卡在了题目的难度上&#xff0c;而是卡在了代码数据的如何输入上。为了避免各位有志之士忽略小细节而导致的前功尽弃&#xff0c;博主特意总结了华为机考试题数据输入的几种情况及其源代码&#xff0c;仅…

go语言day12 包 init() time包 file包

包 包中的 结构体 及结构体属性 方法 都可以通过设置首字母大小写来实现权限访问&#xff0c;首字母大写任何包中都可以访问&#xff0c;首字母小写只在同包中可以访问。 再导入包go文件时&#xff0c;可以给.go文件取别名。 在导入的包名前加入 _ 意思是调用该包的初始…

普中51单片机:矩阵按键扫描与应用详解(五)

文章目录 引言电路图开发板IO连接矩阵键盘的工作原理行列扫描逐行/逐列扫描 LCD1602代码库代码演示——暴力扫描代码演示——数码管(行列式)代码演示——线翻转法代码演示——LCD1602密码锁 引言 矩阵按键是一种通过行列交叉连接的按键阵列&#xff0c;可以有效地减少单片机I/…

AI学习指南机器学习篇-K均值聚类模型应用与Python实践

AI学习指南机器学习篇-K均值聚类模型应用与Python实践 1. 介绍 在机器学习领域&#xff0c;聚类算法是一种常用的无监督学习方法&#xff0c;其中K均值聚类是其中一种经典算法。K均值聚类算法通过将样本分配到K个不同的簇中&#xff0c;使得簇内的样本相似度最大&#xff0c;…

计算机网络 - 万字长文

计算机网络 二、计算机网络2.1 七层模型表格2.2 通俗讲解七层模型2.3 TCP与UDP对比2.4 TCP 三次握手过程==为什么握手是三次,而不是两次或者四次?====三次握手可以携带数据吗?====TCP三次握手失败,服务端会如何处理?====什么是半连接队列?全连接====ISN(Initial Sequence…

基于单片机的太阳能热水器控制系统设计

随着我国经济水平的不断提高&#xff0c;民众对生活质量的追求也在不断进步&#xff0c;对于现代家庭而言&#xff0c;热水器成为了必备的生活电器。目前市面上的电器主要是电热水器、燃气热水器以及太阳能热水器。就能源节约性能而言&#xff0c;太阳能热水器占据了绝对优势&a…

Java | Leetcode Java题解之第223题矩形面积

题目&#xff1a; 题解&#xff1a; class Solution {public int computeArea(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) {int area1 (ax2 - ax1) * (ay2 - ay1), area2 (bx2 - bx1) * (by2 - by1);int overlapWidth Math.min(ax2, bx2) -…

C语言8 数组与字符串

目录 一、数组 定义和初始化 访问数组元素 多维数组 定义和初始化二维数组 访问二维数组元素 多维数组的更多示例 三维数组 访问三维数组元素 二、字符串 定义和初始化字符串 访问字符串元素 字符串操作 计算字符串长度 字符串复制 字符串连接 字符串比较 字…