重生之我在代码随想录刷算法第十九天 | 第77题. 组合、216.组合总和III、 17.电话号码的字母组合

参考文献链接:代码随想录

本人代码是Java版本的,如有别的版本需要请上代码随想录网站查看。

第77题. 组合

力扣题目链接

解题思路

这道题目乍一看可以用暴力解法解决,但如果k的数量增加那就需要套特别多的循环,所以这种组合类题目要学回溯算法。

对于这道题来说,例如1到4内,找两位数组合,也就是12,13,14,23,24,34.

回溯算法都可以化成一个n叉树,其实类似之前二叉树的递归其中还包含一些回溯。更多思路我们在代码中体现。

代码示例
class Solution {
    //用于存一个组合和最后的结果
    private List<Integer> paths = new ArrayList<>();
    private List<List<Integer>> result = new ArrayList<>();

    public List<List<Integer>> combine(int n, int k) {
        backtracking(n,k,1);
        return result;
    }
    //回溯本质还是递归,第一步确定参数,startIndex就是起始,比如说我们第一次递归从1开始,第二次就从2,这样12,13,14才行。
    public void backtracking(int n,int k,int startIndex){
        //如果paths种长度为k,说明收集到一个集合,就要保存一下
        if(paths.size() == k){
            result.add(new ArrayList<>(paths));
            return;
        }
        //for循环遍历
        for(int i = startIndex;i <= n;i++){
            //先把第一个元素加入
            paths.add(i);
            //递归,这次递归从i+1开始,就可以收集到paths了
            backtracking(n,k,i + 1);
            //remove掉刚才加入的就是回溯,这是为了更多的组合,如果不删除的话paths永远都是那两个数字。
            paths.remove(paths.size() - 1);
        }
    } 
}
剪枝操作

我们回溯算法也是一种暴力解法,所以我们可以看一下如何剪枝。

一般回溯的剪枝操作都是对for循环的条件入手,比如这道题,假如n=5 k=4,如果此时paths从3开始收集,345也不会收集到k个元素了,所以这种要剪枝。

我们path中的大小是path.size(),还需要加入k-path.size()个元素,一共有n个,并且起步是从n = 1开始的,所以i <= n - (k-path.size()) + 1即可。

for(int i = startIndex;i <= i <= n - (k-path.size()) + 1;i++)

216.组合总和III

力扣题目链接

解题思路

这道题目跟上一题一样,回溯过程都相同,只不过逻辑处理改一下即可。剪枝操作注意一下。

代码示例
class Solution {
    private List<Integer> paths = new ArrayList<>();
    private List<List<Integer>> result = new ArrayList<>();

    public List<List<Integer>> combinationSum3(int k, int n) {
        backtracking(k,n,1,0);
        return result;
    }

    public void backtracking(int k,int n,int startIndex,int sum){
        //做剪枝
        if(sum > n){
            return;
        }
        if(paths.size() == k){
            if(sum == n){
                result.add(new ArrayList<>(paths));
            }
            return;
        }
        for(int i = startIndex;i <= 9 - (k - paths.size()) + 1;i++){
            paths.add(i);
            backtracking(k,n,i+1,sum + i);
            paths.remove(paths.size() - 1);
        }
    }
}

17.电话号码的字母组合

力扣题目链接

解题思路

这道题跟上面的题有些不同,上面的递归函数有startIndex,因为我们需要控制从哪里开始,但这道题我们是不同的字符串,只需要判断这次递归的是哪个字符串即可。

把该字符串某个字符加入后就下一次递归去加入别的字符串的字符,通过index+1控制不同的字符串即可。

代码示例
class Solution {
    private List<String> result = new ArrayList<>();
    private StringBuilder sb = new StringBuilder();
    //映射关系
    private String[] strings = new String[]{"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};

    public List<String> letterCombinations(String digits) {
        if(digits.length() == 0){
            return result;
        }
        backtracing(digits,0);
        return result;
    }
	
    public void backtracing(String digits,int index){
        //终止条件
        if(index == digits.length()){
            result.add(new String(sb));
            return;
        }
        //首先先获取本次递归对应的字符串
        String temp = strings[digits.charAt(index) - '0'];
        //循环这个字符串
        for(int i = 0;i < temp.length();i++){
            //把该字符串某个字符加入后就下一次递归去加入别的字符串的字符
            sb.append(temp.charAt(i));
            backtracing(digits,index + 1);
            //回溯
            sb.deleteCharAt(sb.length()-1);
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

黑马linux笔记(转载)

学习链接 视频链接&#xff1a;黑马程序员新版Linux零基础快速入门到精通 原文链接&#xff1a;黑马程序员新版Linux零基础快速入门到精通——学习笔记 黑马Linux笔记 文章目录 学习链接01初识Linux1.1、操作系统概述1.1.1、硬件和软件1.1.2、操作系统1.1.3、常见操作系统 1.…

1.资源《Arduino UNO R3 proteus 仿真工程》说明。

资源链接&#xff1a; Arduino UNO R3 proteus 仿真工程 1.文件明细&#xff1a; 2.文件内容说明 包含&#xff1a;proteus工程、原理图、仿真程序。 3.内容展示 4.简述 该文件为proteus工程&#xff0c;用于Arduino uno r3仿真。 因为软件自动运行&#xff0c;所以最小…

编译链接的过程发生了什么?

一&#xff1a;程序的翻译环境和执行环境 在 ANSI C 的任何一种实现中&#xff0c;存在两个不同的环境。 第 1 种是翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令。 第 2 种是执行环境&#xff0c;它用于实际执行代码 也就是说&#xff1a;↓ 1&#xff1…

CVE-2024-9014 pgAdmin4 OAuth2 client ID与secret敏感信息泄漏漏洞

文章目录 免责声明漏洞描述搜索语法漏洞复现nuclei修复建议 免责声明 本文章仅供学习与交流&#xff0c;请勿用于非法用途&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任 漏洞描述 pgAdmin4 是开源数据库 PostgreSQL 的图形管理工具攻击者可构造恶意…

OpenCV库模块解析

1.OpenCV库每个模块解析 2.OpenCV的常用函数 它为计算机视觉应用程序提供了一个通用的基础设施&#xff0c;并加速了在商业产品中使用机器感知。作为BSD许可的产品&#xff0c;OpenCV使企业可以很容易地利用和修改代码。该库拥有超过2500个优化算法&#xff0c;其中包括经典和最…

Hotspot是什么?

Hotspot 简单来说&#xff0c;JVM的一种。 一、HotSpot 的官方定义 HotSpot 是 Oracle 公司开发的一个高性能的 Java 虚拟机&#xff08;JVM&#xff09;。它通过一系列先进的技术和优化手段&#xff0c;为 Java 应用程序提供高效的运行环境&#xff0c;实现了跨平台的代码执行…

页面引导解决方案分享

前言 本文主要介绍的是我们在项目中有时候会遇到需要一步一步引导用户操作的使用场景&#xff0c;类似于新手教学的操作指引&#xff0c;给出的解决方案是Intro.js 库&#xff0c;通过此库创建引导式用户体验。 介绍 Intro.js 是一个轻量级的 JavaScript 库&#xff0c;用于…

《向量数据库指南》深度解析:CLIP模型与Mlivus Cloud在多模态搜索中的强强联合

在当今这个信息爆炸的时代,如何高效、准确地从海量数据中检索出用户所需的信息,成为了摆在我们面前的一大挑战。而多模态搜索,作为一种能够同时处理图像、文本、音频等多种类型数据的搜索技术,正逐渐成为解决这一问题的关键。作为大禹智库的向量数据库高级研究员,同时也是…

【玩转 JS 函数式编程_008】3.1.2 JavaScript 函数式编程筑基之:箭头函数——一种更流行的写法

文章目录 3.1.2 箭头函数——更流行的方式 Arrow functions - the modern way1. 返回值 Returning values2. this 值的处理 Handling the this value3. arguments 的处理 Working with arguments4. 单参数还是多参数&#xff1f; One argument or many? 写在前面 故天将降大任…

【rCore OS 开源操作系统】Rust 字符串(可变字符串String与字符串切片str)

【rCore OS 开源操作系统】Rust 语法详解: Strings 前言 这次涉及到的题目相对来说比较有深度&#xff0c;涉及到 Rust 新手们容易困惑的点。 这一次在直接开始做题之前&#xff0c;先来学习下字符串相关的知识。 Rust 的字符串 Rust中“字符串”这个概念涉及多种类型&…

k8s 中的金丝雀发布(灰度发布)

目录 1 什么是金丝雀发布 2 Canary 发布方式 3 Canary 两种发布方式实操 3.1 准备工作 3.1.1 将 nginx 命名两个版本 v1 与 v2 3.1.2 暴露端口并指定微服务类型 3.1.3 进入 pod 修改默认发布文件 3.1.4 测试 service 是否正常 3.2 基于权重的灰度发布 3.2.1 创建 Igress 资源类…

分享我“Excel 表格”关键字的博客笔记(python脚本全程自动)

Python脚本全程自动&#xff0c;全部Python内建工具脚本纯净。 (笔记模板由python脚本于2024年10月05日 19:51:06创建&#xff0c;本篇笔记适合喜欢Excel和Python的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大…

ubuntu双系统分区划分

EFI系统分区&#xff08;Windows&#xff09;&#xff1a;自Windows 8起&#xff0c;UEFI模式下的BIOS使用该分区。简单来说&#xff0c;它用于存储已安装系统的EFI引导程序。此分区在资源管理器中无法查看&#xff0c;因为它没有驱动器号&#xff0c;但它必须存在&#xff0c;…

前端登录页面验证码

首先&#xff0c;在el-form-item里有两个div&#xff0c;各占一半&#xff0c;左边填验证码&#xff0c;右边生成验证码 <el-form-item prop"code"><div style"display: flex " prop"code"><el-input placeholder"请输入验证…

[Offsec Lab] ICMP Monitorr-RCE+hping3权限提升

信息收集 IP AddressOpening Ports192.168.52.218TCP:22,80 $ nmap -p- 192.168.52.218 --min-rate 1000 -sC -sV -Pn PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.9p1 Debian 10deb10u2 (protocol 2.0) | ssh-hostkey: | 2048 de:b5:23:89:bb:9f:d4:1…

数据校验的总结

业务层进行复杂检查 简单校验交给Controller校验&#xff0c;能流到业务的层的数据就是基本合法 引入依赖&#xff1a;spring-boot-starter-validation 能标注的所有注解在这两个地方看 jakarta.validation.constraints、 org.hibernate.validator.constraints 使用步骤…

Web APIs——Dom获取属性操作

1.变量声明 1.1以后声明变量我们优先使用哪个&#xff1f; const 有了变量先给const&#xff0c;如果发现它后面是要被修改的&#xff0c;再改为let 1.2 为什么const声明的对象可以修改里面的属性&#xff1f; 因为对象是引用类型&#xff0c;里面存储的是地址&#x…

2024 ciscn WP

一、MISC 1.火锅链观光打卡 打开后连接自己的钱包&#xff0c;然后点击开始游戏&#xff0c;答题八次后点击获取NFT&#xff0c;得到有flag的图片 没什么多说的&#xff0c;知识问答题 兑换 NFT Flag{y0u_ar3_hotpot_K1ng} 2.Power Trajectory Diagram 方法1&#xff1a; 使用p…

《Programming from the Ground Up》阅读笔记:p147-p180

《Programming from the Ground Up》学习第9天&#xff0c;p147-p180总结&#xff0c;总计34页。 一、技术总结 1.Physical memeory p152, Physical memory refers to the actual RAM chips inside your computer and what they contain. 物理地址指的RAM&#xff0c;即我们…

库函数相关(上一篇补充)

一、创建自己的头文件 在当前目录下创建一个my_head.h将这个文件移动到/usr/include目录 #ifndef __MY_HEAD_H__ #define __MY_HEAD_H__#include <stdio.h> #include <errno.h> #include <string.h>#define PRINT_ERR(s) do{\printf("%s %s %d\n&quo…