LeetCode——回溯篇(一)

刷题顺序及思路来源于代码随想录,网站地址:https://programmercarl.com

目录

77. 组合

216. 组合总和 III

17. 电话号码的字母组合

39. 组合总和

40. 组合总和 II

77. 组合

给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。

输入:n = 4, k = 2
输出:
[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],
]
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;/*** @author light* @Description 组合** 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。** 你可以按 任何顺序 返回答案。* @create 2023-08-27 10:50*/
public class CombineTest {public static void main(String[] args) {Scanner input=new Scanner(System.in);int n= input.nextInt();int k= input.nextInt();System.out.println(combine(n, k));}public  static List<List<Integer>> res=new ArrayList<>(); //存放结果集public  static List<Integer> path=new ArrayList<>();  //存放路径变量public static List<List<Integer>> combine(int n, int k) {backtracking(n,k,1);return res;}//startIndex:记录每层递归数组起始位置---防止数组元素重复---组合private static void backtracking(int n, int k, int startIndex) {if(path.size()==k){res.add(new ArrayList<>(path));return;}//剪枝操作:可以剪枝的地方就在递归中每一层的for循环所选择的起始位置。//如果for循环选择的起始位置之后的元素个数已经不足我们需要的元素个数了,那么就没有必要搜索了。/*接下来看一下优化过程如下:已经选择的元素个数:path.size();还需要的元素个数为: k - path.size();在集合n中至多要从该起始位置 : n - (k - path.size()) + 1,开始遍历为什么有个+1呢,因为包括起始位置,我们要是一个左闭的集合。*/for (int i = startIndex; i <= n-(k- path.size())+1; i++) {path.add(i);backtracking(n,k,i+1);//回溯path.remove(path.size()-1);}}
}

216. 组合总和 III

找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:

  • 只使用数字1到9
  • 每个数字 最多使用一次 

返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

输入: k = 3, n = 7
输出: [[1,2,4]]
解释:
1 + 2 + 4 = 7
没有其他符合的组合了。
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;/*** @author light* @Description 组合总和III** @create 2023-08-27 11:18*/
public class CombinationSum3Test {public static void main(String[] args) {Scanner input=new Scanner(System.in);int n= input.nextInt();int k= input.nextInt();System.out.println(combinationSum3(k, n));}public static List<List<Integer>> res=new ArrayList<>();public static List<Integer> path=new ArrayList<>();public static List<List<Integer>> combinationSum3(int k, int n) {backtracking(k,n,1,0);return res;}private static void backtracking(int k, int n, int startNum,int sum) {if(sum>n){return;}if(path.size()==k){if(sum==n){res.add(new ArrayList<>(path));}return;}for (int i = startNum; i <=9-(k- path.size())+1 ; i++) {path.add(i);sum+=i;backtracking(k,n,i+1,sum);//回溯path.remove(path.size()-1);sum-=i;}}
}

17. 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

 

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;/*** @author light* @Description 电话号码的字母组合* @create 2023-08-27 12:15*/
public class LetterCombinationsTest {public static void main(String[] args) {Scanner input=new Scanner(System.in);String digits=input.next();System.out.println(letterCombinations(digits));}public static List<String> list=new ArrayList<>();public static List<String> letterCombinations(String digits) {if(digits==null||digits.length()==0){return list;}//初始对应所有的数字,为了直接对应2-9,新增了两个无效的字符串""String[] numString = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};backtracking(digits,numString,0);return list;}public static StringBuilder sb=new StringBuilder();private static void backtracking(String digits, String[] numString, int num) {if(num==digits.length()){list.add(sb.toString());return;}String string=numString[digits.charAt(num)-'0'];for (int i = 0; i <string.length() ; i++) {sb.append(string.charAt(i));backtracking(digits,numString,num+1);sb.deleteCharAt(sb.length()-1);}}
}

39. 组合总和

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。

candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。 

对于给定的输入,保证和为 target 的不同组合数少于 150 个。

输入:candidates = [2,3,6,7], target = 7
输出:[[2,2,3],[7]]
解释:
2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。
7 也是一个候选, 7 = 7 。
仅有这两种组合。
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;/*** @author light* @Description 组合总和** @create 2023-08-27 15:58*/
public class CombinationSumTest {public static void main(String[] args) {Scanner input=new Scanner(System.in);int n=input.nextInt();int[] candidates=new int[n];for (int i = 0; i < n; i++) {candidates[i]=input.nextInt();}int target= input.nextInt();System.out.println(combinationSum(candidates, target));}public static List<List<Integer>> res=new ArrayList<>();public static List<Integer> path=new ArrayList<>();public static List<List<Integer>> combinationSum(int[] candidates, int target) {backtracking(candidates,target,0,0);return res;}private static void backtracking(int[] candidates, int target, int sum, int startIndex) {if(sum==target){res.add(new ArrayList<>(path));return;}if(sum>target){return;}for (int i = startIndex; i < candidates.length; i++) {path.add(candidates[i]);sum+=candidates[i];backtracking(candidates,target,sum,i);path.remove(path.size()-1);sum-=candidates[i];}}
}

40. 组合总和 II

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用 一次 。

注意:解集不能包含重复的组合。 

输入: candidates = [10,1,2,7,6,1,5], target = 8,
输出:
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;/*** @author light* @Description 组合总和II* @create 2023-08-27 16:11*/
public class CombinationSum2Test {public static void main(String[] args) {Scanner input=new Scanner(System.in);int n=input.nextInt();int[] candidates=new int[n];for (int i = 0; i < n; i++) {candidates[i]=input.nextInt();}int target= input.nextInt();System.out.println(combinationSum2(candidates, target));}public static List<List<Integer>> res=new ArrayList<>();public static List<Integer> path=new ArrayList<>();public static List<List<Integer>> combinationSum2(int[] candidates, int target) {Arrays.sort(candidates);int[] used=new int[candidates.length]; //判断集合重元素是否重复使用Arrays.fill(used,0);backtracking(candidates,target,0,used);return res;}private static void backtracking(int[] candidates, int target,int startIndex,int[] used) {if(target==0){res.add(new ArrayList<>(path));return;}for (int i = startIndex; i < candidates.length&&target-candidates[i]>=0; i++) {//要进行树层去重(横向if(i>0&&candidates[i]==candidates[i-1]&&used[i-1]==0){continue;}path.add(candidates[i]);target-=candidates[i];used[i]=1;backtracking(candidates,target,i+1,used);path.remove(path.size()-1);target+=candidates[i];used[i]=0;}}
}

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

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

相关文章

4G智慧电力物联网:建设高效智能,引领电力行业革新!

随着4G与物联网技术的快速发展为电力行业提供了更高效、可靠、智能化的解决方案。本文中智联物联将为大家分享智慧电力系统中的一些关键的物联网技术和通讯设备&#xff0c;如工业4G路由器、分布式发电站、数据采集传输、远程监控管理以及变电站监测。 光伏发电站是电力行业中重…

万级数据优化EasyExcel+mybatis流式查询导出封装

文章目录 前言.千万级数据优化一. 直接上流式查询封装工具代码二. 传统分页导出查询三. 流式查询概念游标查询 前言.千万级数据优化 我们不妨先给大家讲一个概念&#xff0c;利用此概念我们正好给大家介绍一个数据库优化的小技巧&#xff1a; 需求如下&#xff1a;将一个地市表…

在kaggle中用GPU使用CGAN生成指定mnist手写数字

文章目录 1项目介绍2参考文章3代码的实现过程及对代码的详细解析独热编码定义生成器定义判别器打印我们的引导信息模型训练迭代过程中生成的图片损失函数的变化 4总结5 模型相关的文件 1项目介绍 在GAN的基础上进行有条件的引导生成图片cgan 2参考文章 GAN实战之Pytorch 使用…

Django基础6——数据模型关系

文章目录 一、基本了解二、一对一关系三、一对多关系3.1 增删改查3.2 案例&#xff1a;应用详情页3.2 案例&#xff1a;新建应用页 四、多对多关系4.1 增删改查4.2 案例&#xff1a;应用详情页4.3 案例&#xff1a;部署应用页 一、基本了解 常见数据模型关系&#xff1a; 一对一…

好用的网页制作工具就是这6个,快点来看!

对于网页设计师来说&#xff0c;好用的网页设计工具是非常重要的&#xff0c;今天本文收集了6个好用的网页设计工具供设计师自由挑选使用。在这6个好用的网页设计工具的帮助下&#xff0c;设计师将获得更高的工作效率和更精致的网页设计效果&#xff0c;接下来&#xff0c;就一…

【Java alibabahutool】JSON、Map、实体对象间的相互转换

首先要知道三者的互转关系&#xff0c;可以先将JSON理解成是String类型。这篇博文主要是记录阿里巴巴的JSONObject的两个方法。toJSONString()以及parseObject()方法。顺便巩固Map与实体对象的转换技巧。 引入依赖 <!-- 阿里巴巴 JSON转换 以下二选一即可 没有去细研究两者…

Centos 7.6 安装mongodb

以下是在CentOS 7.6上安装MongoDB的步骤&#xff1a; 打开终端并以root用户身份登录系统。 创建一个新的MongoDB存储库文件 /etc/yum.repos.d/mongodb-org-4.4.repo 并编辑它。 sudo vi /etc/yum.repos.d/mongodb-org-4.4.repo在编辑器中&#xff0c;添加下面的内容到文件中并…

什么是字体图标(Icon Font)?如何在网页中使用字体图标?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 字体图标&#xff08;Icon Font&#xff09;⭐ 如何在网页中使用字体图标⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&a…

基于MATLAB/Simulink的三相并网逆变器dq阻抗建模及扫频仿真

目录 整体系统介绍理论模型MATLAB实现 基于Simulink的阻抗扫频仿真整体思路注意事项流程框图 其他 本文主要介绍三相并网逆变器dq阻抗建模的相关知识&#xff0c;和大家分享一下怎么使用MATLAB/Simulink来进行理论模型的搭建以及如何通过扫频获取阻抗模型&#xff0c;一方面是给…

Netty简易聊天室

文章目录 本文目的参考说明环境说明maven依赖日志配置单元测试 功能介绍开发步骤 本文目的 通过一个简易的聊天室案例&#xff0c;讲述Netty的基本使用。同时分享案例代码。项目中用到了log4j2&#xff0c;junit5&#xff0c;同时分享这些基础组件的使用。项目中用到了awt&…

小程序开发之登录授权

小程序开发登录授权流程 看懂这张图登录授权就没问题了&#xff08;哈哈哈哈哈&#xff09; 说明&#xff1a; 调用 wx.login() 获取 临时登录凭证code &#xff0c;并回传到开发者服务器。 调用 auth.code2Session 接口&#xff0c;换取 用户唯一标识 OpenID 和 会话密钥 sess…

【C++】Cmake使用教程(看这一篇就够了)

文章目录 引言一 环境搭建二 简单入门2.1 项目结构2.2 示例源码2.3 运行查看 三 编译多个源文件3.1 在同一个目录下有多个源文件3.1.1 简单版本3.1.1.1 项目结构3.1.1.2 示例代码3.1.1.3 运行查看 3.1.2 进阶版本3.1.2.1 项目结构3.1.2.2 示例源码3.1.2.3 运行查看 3.2 在不同目…

系列十一、AOP

一、概述 1.1、官网 AOP的中文名称是面向切面编程或者面向方面编程&#xff0c;利用AOP可以对业务逻辑的各个部分进行隔离&#xff0c;从而使得业务逻辑各部分之间的耦合度降低&#xff0c;提高程序的可重用性&#xff0c;同时提高了开发的效率。 1.2、通俗描述 不通过…

横扫“盲区”、“看透”缺陷,维视智造推出短波红外相机

在可见光领域&#xff0c;工业相机的视觉应用已经十分成熟&#xff0c;但在日常的客户咨询中&#xff0c;我们也经常接到一些“超纲需求”——客户想要检测“白底上的白色缺陷”、“不透明包装内的透明物体有无”等&#xff0c;均属于可见光无法实现的检测&#xff0c;而市面上…

API接口开发管理平台--多领域企业数字化管理的解决方案

随着数字化时代的到来&#xff0c;企业需要进行数字化转型才能更好地适应市场需求和用户需求。而API接口则是数字化转型中的重要组成部分&#xff0c;可以帮助企业更好地管理信息&#xff0c;提高效率。本文将介绍一种解决方案--API接口开发管理平台&#xff0c;该平台开发出多…

Pygame编程(1)初始化和退出模块

初始化和退出模块 pygame使用基础流程 初始化模块设置主屏窗口程序主循环&#xff08;处理键盘、鼠标、游戏杆、触摸屏等事件&#xff09;退出模块终止程序 import sys import pygame from pygame.locals import *# 1.初始化模块 pygame.init()# 2.设置主屏窗口 display pyg…

SocketTools.NET 11.0.2148.1554 Crack

添加新功能以简化使用 URL 建立 TCP 连接的过程。 2023 年 8 月 23 日 - 12:35新版本 特征 添加了“HttpGetTextEx”函数&#xff0c;该函数在返回字符串缓冲区中的文本内容时提供附加选项。添加了对“FileTransfer”.NET 类和 ActiveX 控件中的“GetText”和“PutText”方法的…

HDLBits-Verilog学习记录 | Verilog Language-Modules(1)

文章目录 20.Module21.Connecting ports by position | Moudle pos22.Connecting ports by name | Module name23.Three modules | Module shift24.Modules and vectors | Module shift8 20.Module practice:You may connect signals to the module by port name or port posi…

FFmpeg支持多线程编码并保存mp4文件示例

之前介绍的示例&#xff1a; (1).https://blog.csdn.net/fengbingchun/article/details/132129988 中对编码后数据保存成mp4 (2).https://blog.csdn.net/fengbingchun/article/details/132128885 中通过AVIOContext实现从内存读取数据 (3).https://blog.csdn.net/fengbingchun/…

几个nlp的小任务(机器翻译)

几个nlp的小任务(机器翻译) 安装依赖库数据集介绍与模型介绍加载数据集看一看数据集的样子评测测试数据预处理测试tokenizer处理目标特殊的token预处理函数对数据集的所有数据进行预处理微调预训练模型设置训练参数需要一个数据收集器,把处理好数据喂给模型设置评估方法参数…