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

Java实现双色球&大乐透随机选号算法——原理详解与代码实战 掌握核心语法:集合操作、随机数生成、排序。贴近实际场景:将编程知识应用于生活问题的解决。 阅读详情

非科班学习算法day22 | LeetCode77:组合 ,Leetcode216:组合总和||| ,Leetcode17:电话号码的字母组合 


介绍

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

相关图解和更多版本:

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


一、LeetCode题目

1.LeetCode77:组合 

题目链接:77. 组合 - 力扣(LeetCode)

题目解析

       参照模板写法,这里的startindex是为了递归而建立,实现了不重复的目标。同时这里需要注意,使用的数组是从1开始的而且已经严格递增。

        中止条件是达到叶子节点,收集该路径。

 c++代码如下:

class Solution {
public:
    // 路径
    vector<int> path;
    // 结果
    vector<vector<int>> res;
    // 回溯函数
    void backtracking(int n, int k, int startindex) {
        // 中止,收集路径
        if (path.size() == k) {
            res.push_back(path);
            return;
        }

        // 递归
        for (int i = startindex; i <= n; ++i) {
            path.push_back(i);
            backtracking(n, k, i + 1);
            path.pop_back();
        }
    }
    vector<vector<int>> combine(int n, int k) {
        backtracking(n, k, 1);
        return res;
    }
};

剪枝操作:需要知道的是,回溯也是暴力搜索,所以存在不必要的搜索环节,在这道题中是如果搜索目标中的结果剩余数小于路径缺失数,那么,该搜索分支停止

i < n - (k - path.size());

 2.Leetcode216: 组合总和|||

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

题目解析

       也是模板写法,比较可以知道,和之前的做法区别就是收集路径的特征不一样,也就是说终止条件不一样。

        这里采用了一个参量sum,这个参量如果不写在这里其实也可以写在外边,定义为全局变量,效果是一样的。

 C++代码如下: 

class Solution {
public:
    vector<int> path;
    vector<vector<int>> res;
    void backtracking(int k, int n, int sum, int startindex) {
        if (sum > n)
            return;
        if (path.size() == k) {
            if (sum == n) {
                res.push_back(path);
                return;
            }
        }

        for (int i = startindex; i < 10; i++) {
            path.push_back(i);
            sum += i;
            backtracking(k, n, sum, i + 1);
            path.pop_back();
            sum -= i;
        }
    }
    vector<vector<int>> combinationSum3(int k, int n) {
        backtracking(k, n, 0, 1);
        return res;
    }
};

剪枝操作:这道题限定了“和”的条件,而且也是一个从1开始的递增数组,那么越加就会越大,如果当前的和sum大于目标值n,那么中止该分支判断。

3.Leetcode17:电话号码的字母组合

题目链接:17. 电话号码的字母组合 - 力扣(LeetCode)

题目解析

       首先破题的点应该是创建一个映射,因为题目这种关系很合适,一个数字对应了一个字符串,这里选用创建字符串数组的原因就是因为可以直接用数字索引,比哈希的写法简单点,然后就是需要注意特殊情况处理,就是1或者0,在这里取空。

        后面是属于模板内容,但是可以发现,又需要在目标字符串(digits)遍历,又要在遍历的字符对应的字符串中遍历(比如“abc”),那么for循环里到底是什么呢?实际上应该是abc,因为这道题目可以理解成在两个字符串甚至多个字符串取值组合,而不像之前的题目是单个字符串上取值,那么定义一个记号index表示遍历取值位置。

C++代码如下:

class Solution {
public:
    // 建立数组映射
    const string tel[10] = {"",    "",    "abc",  "def", "ghi",
                            "jkl", "mno", "pqrs", "tuv", "wxyz"};
    // 路径
    string path;
    // 结果
    vector<string> res;
    // 回溯函数
    void backtracking(string digits, int index) {
        if (path.size() == digits.size()) {
            res.push_back(path);
            return;
        }
        // 转化目标字符串的字符为数字检索
        int digit = digits[index] - '0';
        // 在tel中检索对应字符串
        string target_str = tel[digit];
        for (int i = 0; i < target_str.size(); i++) {
            path.push_back(target_str[i]);
            // 注意这里需要的是检索字符串(digits)下一个字符,因为是在数字对应的新字符串中选取,这就是区别
            backtracking(digits, index + 1);
            path.pop_back();
        }
    }
    vector<string> letterCombinations(string digits) {
        if (!digits.size())
            return res;
        backtracking(digits, 0);
        return res;
    }
};

注意点1:需要注意的其实就是index+1,而不是之前写的i+1,因为处理逻辑是不一样的,index+1,会进入下一层,在新的backtracking里找下一位对应的字符串。而i+1也是进入下一层,但是是在当前字符串内取值。

注意点2:求结果函数里检查了是否为空,其实就是在跑示例时候发现空会输出“”,这里加强代码健壮性。

 

总结


打卡第 22天,坚持!!!

保姆级教程:用SNAP处理哨兵一号数据,5步搞定城区范围提取(附江西晋城案例) 本文提供了一份详细的保姆级教程,介绍如何使用SNAP软件处理哨兵一号数据,通过5个关键步骤快速提取城区范围。以江西晋城为例,教程涵盖数据准备、预处理、核心处理流程、自动化搭建及成果分析,帮助用户轻松掌握SNAP操作技巧,适用于城市规划、环境监测等领域。 阅读详情

相关推荐

微机原理课程设计-模拟十字路口交通信号灯

一、设计任务描述 1.1设计目的 通过课程设计使学生更进一步掌握微机原理及应用课程的有关知识,提高应用微机解决问题的能力,加深对微机应用的理解。通过查阅资料,结合所学知识进行软、硬件的设计,使学生初步掌握应用微机解决问题的步骤及方法。为以后学生结合专业从事微机应用设计奠定基础。 1.2 设计要求 控制LED灯,按照十字路口红绿灯的原理亮灭显示: (1) 东西方向车辆放行x秒...

Learning_is_endless的博客 2万+

代码随想录-算法训练营day60(单调栈03:柱状图中最大的矩形)

单调栈03:数组中的最大矩形

weixin_61931006的博客 675

从Protocol到硬件控制:揭秘高通UEFI中ABL与XBL的协作机制

本文深入解析了高通UEFI架构中ABL与XBL的协作机制,重点探讨了Protocol通信在硬件控制中的关键作用。通过对比传统GPIO控制方式,揭示了Protocol架构在安全性、可维护性和灵活性方面的优势,并提供了关机充电场景的实战案例分析及调试技巧。

weixin_29185199的博客 431

代码随想录算法训练营第六十天|Day60 图论

Bellman_ford 队列优化算法(又名SPFA)本题我们来系统讲解 Bellman_ford 队列优化算法 ,也叫SPFA算法(Shortest Path Faster Algorithm)。SPFA的称呼来自 1994年西南交通大学段凡丁的论文,其实Bellman_ford 提出后不久 (20世纪50年代末期) 就有队列优化的版本,国际上不承认这个算法是是国内提出的。所以国际上一般称呼 该算法为 Bellman_ford 队列优化算法(Queue improved Bellman-Ford)

a6666999d的博客 1986

YOLOv8n行人检测实战:从数据集准备到模型训练

本文详细介绍了使用YOLOv8n进行行人检测的完整流程。首先阐述了YOLOv8的优势:高速推理(300+FPS)、更高精度、易用性和轻量化(仅6MB)。接着通过Docker搭建GPU训练环境,配置32GB共享内存避免数据加载问题,并安装必要的框架和OpenCV组件。数据集采用COCO2017标注格式,包含归一化坐标的YOLO标签文件。通过可视化脚本验证标注准确性后,提出多数据集融合训练策略以增强模型泛化能力。最后使用Ultralytics框架启动训练,展现了从环境搭建到模型训练的完整技术路径。该方案兼顾检测

Hi20240217的博客 1091

使用SpringBoot+Vue3开发项目(1)---- 设计用户注册和登录的接口及页面

本文基于黑马大事件项目介绍如何使用SpringBoot+Vue3来实现前后端联调的登录与注册操作。

记得开心一点嘛的博客 3643

代码随想录系统性一刷总结

指针思想很重要day01 二分查找+移除元素day02 数组平方+长度最小子数组+螺旋矩阵II。

qq_44072579的博客 1048

华为OD机考双机位C卷 - 信道分配(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 信道分配

算法大师! 453

代码随想录总结篇章

历时两个月60天的代码随想录结束了,本次一刷leetcode收获很多,将经典题目都刷了一遍,感觉到自己的代码能力有显著提升,感谢老师们每天的提醒,原来想着两个月坚持下来是件难事,但坚持下来后发现也没有那么难,日积月累收获良多,下面是各题型总结:来源于同期录友:代码随想录算法训练营总结-优快云博客 来源于同期录友:代码随想录算法训练营总结-优快云博客

qq_60959261的博客 1098

YOLOv8轻量化模型瘦身术:深度解析与实战LAMP剪枝 YOLOv8(2021)

YOLOv8模型LAMP剪枝技术解析与实战 本文深入探讨了LAMP剪枝技术在YOLOv8目标检测模型中的应用。针对深度学习模型部署面临的资源限制问题,LAMP剪枝通过最小化L2失真和层自适应稀疏度分配,实现了高效模型压缩。相比传统幅度剪枝的"一刀切"方法,LAMP创新性地将剪枝建模为优化问题,定义LAMP分数来衡量权重重要性,自动确定各层最佳剪枝率。文章从理论基础出发,详细解析了LAMP的核心数学公式和算法流程,并提供了完整的YOLOv8移植实战指南,包括代码结构、剪枝步骤和微调策略。通

FJN110的博客 2422

英飞凌TC3xx之一起认识GTM系列(六)如何实现GTM与VADC关联的配置

本文给出了GTM与EVADC之间关联的细节,并通过两个实例分别说明了如何对寄存器进行配置。

无所适从的我的博客 2933

代码随想录训练营 Day60打卡 图论part10 SPFA算法 Bellman-Ford 之判断负权回路 Bellman-Ford 之单源有限最短路

代码随想录训练营 Day60打卡 图论part10 SPFA算法 Bellman-Ford 之判断负权回路 Bellman-Ford 之单源有限最短路

qq_42952637的博客 2033

2024年广东省职业院校技能大赛“区块链技术应用”任务书—区块链应用系统开发参考答案

摘要 本文档提供了2024年广东省职业院校技能大赛"区块链技术应用"项目中区块链电子签章前端功能开发的参考答案。主要内容包括:1)注册页面开发,实现身份证号码双向绑定和注册请求发送;2)登录页面开发,实现用户认证、状态保存和页面跳转;3)个人印章页面开发,实现注销功能和印章信息展示。每个任务均包含具体实现代码片段和功能测试要点,涵盖Vue.js框架下的数据绑定、axios请求处理和本地存储等关键技术点。

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 345

22.代码随想录算法训练营第二十二天|77. 组合,216. 组合总和 III,17. 电话号码的字母组合

力扣算法和代码随想录

LXY999222的博客 785

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

代码随想录算法训练营第60天 | 单调栈 ●84 柱形图中最大的矩形 ●两个月训练营总结

一刷结束

weixin_51674457的博客 270

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

_22LeetCode代码随想录算法训练营第二十二天-回溯算法 | 216.组合总和III、17.电话号码的字母组合

_22LeetCode代码随想录算法训练营第二十二天-回溯算法 | 216.组合总和III、17.电话号码的字母组合

Jasmine-Lily的博客 319

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

代码随想录Day22

理论基础60天训练营打卡计划Day22学习内容:理论基础77. 组合。

2301_81634068的博客 265

代码随想录-算法训练营day60【单调栈03:柱状图中最大的矩形】

代码随想录-算法训练营day60【单调栈03:柱状图中最大的矩形】

upward 634

【代码随想录训练营第42期 Day60打卡 - 图论Part10 - Bellman_ford算法系列运用

Bellman_ford算法

记得要努力变强 1796

代码随想录二刷——二叉树day22

一个本硕双非的小菜鸡,备战24年秋招,计划二刷完卡子哥的刷题计划,加油!

qq_43264167的博客 993

代码训练营 day60|并查集检测环(有向图、无向图)

今天主要学习了并查集的一系列操作,有向图检查环和无向图检查环简直不是一个难度级别的加油,坚持打卡的第60天。

qq_44639909的博客 777

代码随想录算法训练营第60天 | 1、城市间货物运输I,2、城市间货物运输II,3、城市间货物运输III

因为每次松弛操作只会更新一条路径,所以如果每次松弛操作都对每条边进行则会造成冗余计算,因为后续的结果会将前面的结果覆盖掉,比如进行第一次松弛操作,那么则会更新从源点出发的一条路径,如果按照之前没有优化的算法,那么则会将每条边进行操作,但是有效的就只有从源点出发的第一条路径,第二次松弛操作时,有效的是从源点出发跨两条路径的路径,这时就会对第一次的跨两条路径的值覆盖掉,以此类推,所以其实可以不用在每次松弛操作时都对每一条边更新。注意这里的k=2是最多能经过的结点,也可以少于它,只要最后是最短的即可。

m0_68237332的博客 1253

【代码随想录算法训练营】第一天 | 第一章 数组(一)

代码随想录算法训练营 第一天 数组 二分查找 双指针

jhl1102的博客 549

随想录训练营22/60 | LC 216.组合总和III;LC 17.电话号码的字母组合

k个数相加等于n,这k个数不能重复且只能从1到9中选,返回的是满足条件的所有k个数组成的vector。本题思路和 77.组合相同,k为二叉树深度,从i到9(i从1到9取值)为二叉树的孩子个数,进行递归。:用map将每个数字对应的字符串保存起来,按照输入的字符串(数字)进行递归遍历,递归的深度就是数字串的长度,每次递归的宽度就是数字对应的字符串长度。也可以将sum在递归中传入,回溯的时候也要对sum进行回溯。

weixin_43845977的博客 189

day60 | Bellman_ford 队列优化算法 bellman_ford之判断负权回路 bellman_ford之单源有限最短路

输出一个整数,表示从城市 src 到城市 dst 的最低运输成本,如果无法在给定经过城市数量限制下找到从 src 到 dst 的路径,则输出 “unreachable”,表示不存在符合条件的运输方案。某国为促进城市间经济交流,决定对货物运输提供补贴。共有 n 个编号为 1 到 n 的城市,通过道路网络连接,网络中的道路仅允许从某个城市单向通行到另一个城市,不能反向通行。共有 n 个编号为 1 到 n 的城市,通过道路网络连接,网络中的道路仅允许从某个城市单向通行到另一个城市,不能反向通行。

m0_65709641的博客 889

day22 | 77. 组合 216.组合总和III 17.电话号码的字母组合

216.组合总和III注意:此题每个数字最多使用一次,该列表不能包含相同的组合两次所以startIndex后续加1(仅代表个人观点)

m0_65709641的博客 587
上一篇: 代码随想录算法训练营:21/60
下一篇: 代码随想录算法训练营:23/60
Dustin_c
博客等级 码龄3年 391粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值