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.mfbz.cn/a/102922.html

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

相关文章

RK3568 USB支持接口类型

一.简介 RK356x 总共支持 4 个 USB 外设接口&#xff0c;包括 1 个OTG 接口&#xff0c;1 个 USB 3.0 Host 接口&#xff0c;以及 2 个 USB 2.0 Host 接口。 二.常用接口类型介绍 Type-C 接口类型&#xff1a; Type-A 接口类型&#xff1a; Type-A USB 3.1 接口&#xff1a;…

【云原生进阶之PaaS中间件】第一章Redis-1.3Redis配置

1 Redis配置概述 Redis支持采用其内置默认配置的方式来进行启动&#xff0c;而不需要提前配置任何文件&#xff0c;但是这种启动方式只推荐在测试和开发环境中使用&#xff0c;但更好的方式是通过提供一个Redis的配置文件来对Redis进行配置&#xff0c; 这个配置文件一般命名为…

Ansible学习笔记4

file模块&#xff1a; file模块用于对文件相关的操作&#xff08;创建、删除、属性修改、软链接等&#xff09;touch是创建。 [rootlocalhost ~]# ansible group1 -m file -a "path/tmp/111 statetouch" 192.168.17.105 | CHANGED > {"ansible_facts"…

字节前端实习的两道算法题,看看强度如何

最长严格递增子序列 题目描述 给你一个整数数组nums&#xff0c;找到其中最长严格递增子序列的长度。 子序列是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7…

《TCP/IP网络编程》阅读笔记--Socket类型及协议设置

目录 1--协议的定义 2--Socket的创建 2-1--协议族&#xff08;Protocol Family&#xff09; 2-2--Socket类型&#xff08;Type&#xff09; 3--Linux下实现TCP Socket 3-1--服务器端 3-2--客户端 3-3--编译运行 4--Windows下实现 TCP Socket 4-1--TCP服务端 4-2--TC…

Windows下将nginx等可执行文件添加为服务

Windows下将nginx等可执行文件添加为服务 为什么将可执行文件添加为服务&#xff1f;将可执行文件添加为服务的步骤步骤 1&#xff1a;下载和安装 Nginx步骤 2&#xff1a;添加为服务方法一&#xff1a;使用 Windows 自带的 sc 命令方法二&#xff1a;使用 NSSM&#xff08;Non…

新版Mongodb(6.0以上)找不到mongo.exe

安装目录下/bin目录中&#xff0c;没有mongo.exe文件&#xff0c;只有mongod和mongos&#xff0c;以及一个powershell命令脚本。 原因在于&#xff0c;mongodb6.0以后做出了重大改变&#xff0c;mongodb已经不再默认为你安装shell工具&#xff0c;因此需要安装一个额外的shell…

python venv 打包,更换路径后,仍然读取到旧路径 ,最好别换路径,采用docker封装起来

机械盘路径 /home/yeqiang/code/xxx 移动到 /opt/xxx 编辑/opt/xxx/venv/bin/activate VIRTUAL_ENV"/home/yeqiang/code/xxx/venv" 改为 VIRTUAL_ENV"/opt/xxx/venv" 下面还有这么多&#xff0c;参考&#xff1a; (venv) yeqiangyeqiang-MS-7B23:/…

Android修改默认gradle路径

Android Studio每次新建项目&#xff0c;都会默认在C盘生成并下载gradle相关文件&#xff0c;由于C盘空间有限&#xff0c;没多久C盘就飘红了&#xff0c;于是就需要把gradle相关文件转移到其他盘 1、到C盘找到gradle文件 具体路径一般是&#xff1a;C:\Users\用户\ .gradle …

WPF实战项目十四(API篇):登录注册接口

1、新建UserDto.cs public class UserDto : BaseDto{private string userName;/// <summary>/// 用户名/// </summary>public string UserName{get { return userName; }set { userName value;OnPropertyChanged(); }}private string account;/// <summary>…

Mysql锁及行锁机制探索

先讲一下mysql存储方式(innodb) 分为&#xff0c;聚簇索引和非聚簇索引。 聚簇索引&#xff0c;就是b树的所有真实数据。 聚簇索引不是一种索引类型&#xff0c;而是一种数据存储方式。innoDB的聚簇索引实际上在同一个结构中保存了B-Tree索引和数据行。当表有聚簇索引时&…

Ubuntu20.04下安装搜狗输入法Linux版

Ubuntu20.04下安装搜狗输入法Linux版 参考搜狗输入法的官网安装指南&#xff1b; 第一步&#xff1a;打开搜狗输入法官网&#xff1b; https://shurufa.sogou.com/ 点击X86_64后将会自动跳转到搜狗输入法的安装指南中&#xff1b; 安装指南 Ubuntu搜狗输入法安装指南 搜狗…

javaee之黑马乐优商城1

问题1&#xff1a;整体的项目架构与技术选型 技术选型 开发环境 域名测试 如何把项目起来&#xff0c;以及每一个目录结构大概是什么样子 通过webpack去启动了有个项目&#xff0c;这里还是热部署&#xff0c;文件改动&#xff0c;内容就会改动 Dev这个命令会生成一个本地循环…

Leetcode54螺旋矩阵

思路&#xff1a;用set记录走过的地方&#xff0c;记下走的方向&#xff0c;根据方向碰壁变换 class Solution:def spiralOrder(self, matrix: list[list[int]]) -> list[int]:max_rows len(matrix)max_cols len(matrix[0])block_nums max_cols * max_rowscount 1i 0j…

Spring: HiddenHttpMethodFilter的用法及原理

作用&#xff1a;将html表单提交的post请求转换为put请求或delete请求发给接口。 html不支持put和delete. 一、web.xml中配置过滤器 <filter><filter-name>HiddenHttpMethodFilter</filter-name><filter-class>org.springframework.web.filter.HiddenH…

【大模型AIGC系列课程 3-3】低成本的领域私域大模型训练方法

重磅推荐专栏: 《大模型AIGC》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经验分享,旨在帮助读者更好地…

【JS】—闭包—双例对比法学习总结

一、选定知识点&#xff1a;闭包 二、指令学习 1. 闭包MDN的定义 闭包&#xff08;closure&#xff09;是一个函数以及其捆绑的周边环境状态&#xff08;lexical environment&#xff0c;词法环境&#xff09;的引用的组合。换而言之&#xff0c;闭包让开发者可以从内部函数…

从零开始搭建AI网站(6):如何使用响应式编程

响应式编程&#xff08;Reactive Programming&#xff09;是一种编程范式&#xff0c;旨在处理异步数据流和事件流。它通过使用观察者模式和函数式编程的概念&#xff0c;将数据流和事件流抽象为可观察的序列&#xff0c;然后通过操作这些序列来实现各种功能。 在响应式编程中…

2023谷歌开发者大会直播大纲「终稿」

听人劝、吃饱饭,奉劝各位小伙伴,不要订阅该文所属专栏。 作者:不渴望力量的哈士奇(哈哥),十余年工作经验, 跨域学习者,从事过全栈研发、产品经理等工作,现任研发部门 CTO 。荣誉:2022年度博客之星Top4、博客专家认证、全栈领域优质创作者、新星计划导师,“星荐官共赢计…

Arthas教程 - 安装篇 (一)

目录 一、在线安装 1.1 Windows安装 1.2 小结 1.3 linux安装 二、离线安装 一、在线安装 1.1 Windows安装 本地指定目录下&#xff08;例如我是&#xff1a;F:\测试\arthas&#xff09;&#xff0c;使用Windows的cmd窗口&#xff0c;执行如下命令则会将jar包下载下来。大…