LeetCode——回溯篇(一)

news2024/11/15 11:21:25

刷题顺序及思路来源于代码随想录,网站地址: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.coloradmin.cn/o/935865.html

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

相关文章

UE4/5在蓝图细节面板中添加函数按钮(蓝图与c++的方法)

目录 在细节面板中添加按钮使用函数 蓝图的方法 事件 函数 效果 uec的方法 效果 在细节面板中添加按钮使用函数 很多时候&#xff0c;我们可以看到一些插件的actor类中&#xff0c;点击一下之后就可以实现如矩阵一样的效果。 实际上是因为其使用了函数来修改了蓝图中的数…

Compose - 容器组合项

一、延迟列表 LazyColumn、LazyRow 可滚动&#xff0c;类似RecyclerView&#xff08; Column、Row 用 Modifier 设置滚动是相当于ScrollView&#xff09;。 key设置为集合元素的唯一值例如id&#xff0c;使得列表能感知元素位置是否发生变化或新增移除&#xff0c;对于内容是否…

基于vue和element的脚手架【vue-element-admin 和vue-element-plus-admin 】

vue-element-admin vue-element-admin 是一个后台前端解决方案&#xff0c;它基于 vue 和 element-ui实现 介绍 | vue-element-adminA magical vue adminhttps://panjiachen.github.io/vue-element-admin-site/zh/guide/ vue-element-plus-admin vue-element-plus-admin 是一…

Python 通过traceback追溯异常信息

Python 通过traceback追溯异常信息 导入traceback包 import traceback自定义函数 def func_3():return 1 / 0def func_2():func_3()def func_1():func_2()捕捉异常 try:func_1() except Exception as e:traceback_info traceback.format_exc()print("traceback_info"…

Java IO流动(实战操作)

目录 1 IO流原理2 IO流的分类3 输入、输出流代码示例4 小结5 文件在前后台之间传递 在Java中&#xff0c;IO流是一种用于处理输入和输出操作的机制。它提供了一种统一的方式来读取和写入数据&#xff0c;平日开发中在文件读写&#xff0c;网络通信&#xff0c;特定场景的数据库…

哔哩哔哩 B站 bilibili 视频倍速设置 视频倍速可自定义

目录 一、复制如下代码 二、在B站视频播放页面进入控制台 三、将复制的代码粘贴到下方输入框&#xff0c;并 回车Enter 即可 四、然后就可以了 一、复制如下代码 &#xff08;该代码用于设置倍速为3&#xff0c;最后的数值是多少就是多少倍速&#xff0c;可以带小数点&#…

Docker容器:Harbor 私有仓库迁移

文章目录 一.私有仓库迁移的介绍1.为何要对Harbor 私有仓库的迁移2.Harbor 私有仓库的迁移特点3. Harbor 私有仓库的迁移注意要点 二.私有仓库迁移配置1.源Harbor配置&#xff08;192.168.198.11&#xff09;&#xff08;1&#xff09;接着以下操作查看容器状况及是否可以登录 …

【滑动窗口】leetcode1004:最大连续1的个数

一.题目描述 最大连续1的个数 这道题要我们找最大连续1的个数&#xff0c;看到“连续”二字&#xff0c;我们要想到滑动窗口的方法。滑动窗口的研究对象是一个连续的区间&#xff0c;这个区间需要满足某个条件。那么本题要找的是怎样的区间呢&#xff1f;是一个通过翻转0后得到…

容器导入与导出

docker的一大优势就是可移植性&#xff0c;容器因此docker容器可以随意的进行导入导出操作。 容器导出 使用export命令可以导出容器&#xff0c;具体操作如下&#xff1a; 创建一个容器&#xff0c;进行基本的配置操作 本案例中我首先创建一个nginx容器&#xff0c;然后启动…

开发过程中自己遇到的异常(六)

连接数据库失败&#xff1a; InternalError: (pymysql.err.InternalError) (1130, "Host xxx.xx.1.106 is not allowed to connect to this MySQL server") (Background on this error at: http://sqlalche.me/e/2j85) 解决方式&#xff1a; mysql> use mysql; …

基于静电放电算法优化的BP神经网络(预测应用) - 附代码

基于静电放电算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于静电放电算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.静电放电优化BP神经网络2.1 BP神经网络参数设置2.2 静电放电算法应用 4.测试结果&#xff1a;5…

DebugInfo 模型功能系统介绍 文本上色 文本与表格对齐 分隔线 秒表计算器 语义日期

背景 今天系统性的为大家介绍一下 DebugInfo 模块。这个模块提供了一些丰富的基本功能的封装&#xff0c;希望能给有需要的人带来些许帮助。 文本上色 DebugInfo 模块引入了 colorama提供文本颜色支持。 # -*- coding:UTF-8 -*-# region 引入必要依赖 from DebugInfo.DebugI…

NGINX相关配置

NGINX相关配置 NGINX配置信息 nginx 官方帮助文档&#xff1a;http://nginx.org/en/docs/Nginx的配置文件的组成部分&#xff1a; 主配置文件&#xff1a;/conf/nginx.conf(/nginx/conf/nginx.conf) 子配置文件: include conf.d/*.conf#事件驱动相关的配置 同步 event { wo…

VMware安装启动windows虚拟机出错 efi vmware virtual ...... No media

本人是在最近一台新电脑想要装windows系统的虚拟机&#xff0c;下载了VMware workstation 17pro&#xff0c;也下载了官方的windows系统镜像iso文件。 但是在开启虚拟机的过程中&#xff0c;出现了类似以下的错误&#xff1a; efi vmware virtual … No media 看到有人说需要下…

OLED透明屏技术:引领品牌营销的视觉革命

在当今竞争激烈的市场中&#xff0c;品牌营销的成功与否关系到企业的生存和发展。 而随着科技的不断进步&#xff0c;新的广告展示技术不断涌现&#xff0c;其中OLED透明屏技术以其独特的视觉效果和创新性的应用在品牌营销领域引起了广泛关注。 那么&#xff0c;尼伽将详细介…

flutter和原生利用pigeon建立通道

首先导入依赖&#xff1a; dependencies: pigeon: ^10.0.0定义一个文件&#xff1a; /// 用于定于flutter和平台的桥接方法 /// HostApi() 标记的&#xff0c;是用于 Flutter 调用原生的方法&#xff1b; /// FlutterApi() 标记的&#xff0c;是用于原生调用 Flutter 的方法&…

pycharm 右键运行代码时总是测试模式运行(run pytest)

*# 问题 使用pycharm时&#xff0c;右键运行代码&#xff0c;结果是这样的&#xff1a; 运行_‘pytesr(xxx.py 内)’ 英语界面可能是这样&#xff1a;run_‘pytesr(xxx.py)’我并不想使用测试模式。如何改回正常模式&#xff1f; 解决办法 本着遇到什么问题就搜什么问题的态…

英语略读三

课文的客观&#xff0c;或者逻辑推理 同增通减 比错 对比选项&#xff0c;找一个明显的区别 防并列&#xff0c;文章再说主语在干嘛干嘛的&#xff0c;但是与答案的角度不一样&#xff0c;是并列的关系 在对比选项&#xff0c;不是证明正确的 具体问题具体分析&#xff0c;but…

ICCV 2023 Oral | 从无约束图像集合中生成新视角的交叉光线神经辐射场

文章链接&#xff1a;https://arxiv.org/abs/2307.08093 代码链接&#xff1a;https://github.com/YifYang993/CR-NeRF-PyTorch.git 01. 介绍 本工作旨在通过从不受限制的图像集合&#xff08;例如从互联网中爬取的图像&#xff09;中合成新视角图片&#xff0c;从而提供3D沉浸…

在大规模推荐系统中整合 ML 模型的经验教训

一、说明 在这篇博文中&#xff0c;我们分享了将 Netflix 大规模搜索和推荐系统的多个相关机器学习模型整合到一个统一模型中的系统设计经验。给定不同的推荐用例&#xff0c;许多推荐系统将每个用例视为单独的机器学习任务&#xff0c;并为每个任务训练定制的 ML 模型。相比之…