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://xiahunao.cn/news/1619068.html

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

相关文章

SQL Server 配置管理器无法打开

背景 在把机器重启后SQL SERVER 配置管理器就无法正常打开了 现象 Connection to target machine could not be made in a timely fashion 解决 打开服务器的服务列表&#xff0c;找到 Windows Management Instrumentation 服务&#xff0c;重启下他问题解决 总结 配置管理器我…

解决SQLSever配置管理器不见了

错误&#xff1a; 在与SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且SQL Server 已配置为允许远程连接。provider:Named Pipes Provider&#xff0c;error&#xff1a;40-无法打开到SQL Server 的连接&#x…

【rust/egui】(六)看看template的app.rs:TextEdit

说在前面 rust新手&#xff0c;egui没啥找到啥教程&#xff0c;这里自己记录下学习过程环境&#xff1a;windows11 22H2rust版本&#xff1a;rustc 1.71.1egui版本&#xff1a;0.22.0eframe版本&#xff1a;0.22.0上一篇&#xff1a;这里 TextEdit 文本编辑框 其定义为&#…

SQL Server 配置管理器不见了

SQL Server 配置管理器不见了 错误重现&#xff1a; 之前安装好的SQL Server 2012打开都没有问题&#xff0c;好多天没有打开了&#xff0c;今天打开我的SQL Server 2012 连接时出现错误&#xff1a; 在与SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或…

如何打开sql server配置管理器

1. 在开始菜单中找 2.如果开始菜单中找不到 按 win键R键 打开后在里面输入 SQLServerManager10.msc 这里的 SQLServerManager10.msc 对应的是SQL Sever 2008 SQL Sever 2019版本的对应的是 SQLServerManager15.msc 具体你sql server的版本对应的哪个&#xff0c;可以去C:\…

SQL 配置管理器找不到了

想用数据库建立远程连接&#xff0c;于是想把数据库改成IP地址连接&#xff0c;突然发现配置管理器不见了&#xff01;&#xff01;&#xff01;&#xff01;&#xff1f;&#xff1f;&#xff1f;百度了一下&#xff0c;有人说可以用win R打开后&#xff0c;输入 SQLServerMa…

SQLServer找不到配置管理器,如何打开配置管理器

总有些sqlserver安装完毕之后找不到配置管理器&#xff0c;想看个端口号或者看个服务的用户名&#xff0c;都很气。下面来介绍一下通过windows命令来打开SQLSERVER配置管理器。 首先&#xff1a;windows键R键 各个sqlserver版本在textbox中输入对应的命令如下&#xff1a; SQ…

空号检测API 接入的Java 和 Python 代码总结

空号检测api 是一种基于手机号码查询的技术工具&#xff0c;可以帮助企业准确识别无效手机号&#xff0c;包括空号、停机、库无等状态。通过使用空号检测API&#xff0c;企业能够过滤掉无效的手机号&#xff0c;确保将有限的资源和精力用于有效的目标客户群体&#xff0c;从而提…

【git进阶使用】 告别只会git clone 学会版本控制 ignore筛选 merge冲突等进阶操作

git使用大全 基本介绍git 快速上手一 环境安装&#xff08;默认已安装&#xff09;二 远程仓库克隆到本地1 进入rep文件夹目录2 复制远程仓库地址3 git clone克隆仓库内容到本地4 修改后版本控制4.1 修改文件4.2 git status查看版本库文件状态4.3 git add将文件加入版本库暂存区…

圣诞桌面装饰软件Xmas snow for Mac

Xmas snow for Mac是专为Mac用户所设计的圣诞桌面装饰软件&#xff0c;Xmas snow Mac版在您的桌面用下雪的方式来告诉你圣诞新年倒计时。您可以使用Xmas snow Mac破解版在您的桌面上添加圣诞树、圣诞花环、雪花、倒计时&#xff0c;您还可以每小时聆听圣诞节的曲调哦&#xff0…

c语言 桌面下雪程序,用C++写的在桌面上飘雪的特效程序

#include〈windows.h〉 #include〈time.h〉 #include〈stdlib.h〉 #include〈iostream.h〉 const int SnowNumber=500; //雪点数量 struct SnowNode {POINT postion; //雪点位置 int iColor; //先前的颜色 int iSpeed; //下落速度 int iMove; //下落距离 int iStick; //粘贴度 …

Linux/Unix桌面趣事:让桌面下雪

在这个节日里感到孤独么?试一下 Xsnow 吧&#xff01;它是一个可以在 Unix/Linux 桌面下下雪的应用。圣诞老人和他的驯鹿会在屏幕中奔跑&#xff0c;伴随着雪片让你感受到节日的感觉。 我第一次安装它还是在 13、4 年前。它最初是在 1984 年 Macintosh 系统中创造的。你可以用…

一个让桌面下雪的小程序(并非屏幕保护)

以前见到过一个有趣的小程序&#xff0c;叫snow,可以在桌面上下雪&#xff0c;学还可以在窗体边缘、图像边缘堆积&#xff0c;关键是并非屏幕保护&#xff0c;可以边下雪便运行其它程序。 我就用VB模仿了一个。先贴上效果图&#xff1a; 源代码 Private Declare Function GetDC…

桌面下雪软件测试工程师,Snow Flakes屏幕下雪动态屏保 模拟真实降雪情景的屏保程序...

《Snow Flakes屏幕下雪动态屏保》是一个完美模拟真实降雪情景的屏幕保护程序&#xff0c;可以让你的电脑在没有动作时下起片片雪花&#xff0c;也会随着时间而在工作列上堆积起冰来&#xff0c;相当真实。 Snow Flakes屏幕下雪屏保支持在设置视窗中可以依个人喜欢自行设置风势的…

JavaSE实现桌面屏幕下雪功能

效果图&#xff1a; 使用的是Java AWTUtilities API 建议使用JDK1.8 开发工具 IDEA所有代码如下 import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.ArrayList; import com.sun.awt.AWTUti…

linux桌面下雪,一个让桌面下雪的ruby 小程序 snow

[Ruby]代码 #!/usr/bin/env ruby # -*- coding: gb18030 -*- # 2011-3 #ruby 1.8.7 (2011-02-18 patchlevel 334) [i386-mingw32] #gem 1.6 #gem install win32-api windows-pr windows-api cstruct #比如要使用 GetDC这个API时,搜索包含文字GetDC的文件在这个目录: D:\Ruby18\…

桌面下雪小程序 WIN32

想起以前还没有上大学的时候&#xff0c;过圣诞节&#xff0c;有同学发了一个桌面下雪的小程序。当看到效果的&#xff0c;哇&#xff0c;当时觉得好高端&#xff0c;就想什么时候我也能写出这么一个程序。学了计算机之后&#xff0c;发现这完全可以实现。于是就准备写一个&…

linux命令画圣诞树图片,Linux如何用Xsnow命令让桌面显示下雪特效

Linux系统下其实有很多有趣的命令&#xff0c;利用这些命令可以达到一些特别的效果。比如说Xsnow&#xff0c;可以让桌面下雪。具体应该怎么实现呢&#xff1f;一起来看一下吧。 方法如下&#xff1a; 一、安装 xsnow Debian/Ubuntu/Mint 用户用下面的命令&#xff1a; $ sudo …

桌面下雪程序的编写

一&#xff0e; 综述 考虑到雪花将会很多&#xff0c;并且每个雪花都有自己的行为路径&#xff0c;统一处理比较麻烦&#xff0c;因此自定义一个类CSnowflake&#xff0c;它所呈现的主要接口有两个&#xff1a;下落和“死亡”判断。下落路径由雪花对象自身处理&#xff0c;主框…

桌面下雪软件测试工程师,Xsnow - 在Ubuntu 18.04及更高版本的桌面上下雪

原标题&#xff1a;Xsnow - 在Ubuntu 18.04及更高版本的桌面上下雪 Xsnow&#xff0c;让它在你的桌面上下雪吧&#xff0c;现在正在Ubuntu 18.04或更高版本的Gnome, KDE, FVWM桌面上工作。 Xsnow是一个方便的命令工具&#xff0c;可以将圣诞节带到您的桌面。但是&#xff0c;它…