代码随想录day21 Java版

过完年开始刷回溯算法,寒假在家时间多点,争取每天多刷点题

回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案。通常是解决复杂的题。

回溯法解决的问题都可以抽象为树形结构,因为回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度,都构成的树的深度。

模板

void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果}
}

77. 组合

重点在调用递归的代码,本质上是取代未知层数的循环

码题时直接add了path,最终 res 列表中所有的元素都会指向同一个对象,会导致结果不正确。

class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> path = new ArrayList<>();public List<List<Integer>> combine(int n, int k) {backtrack(n,k,1);return res;}void backtrack(int n, int k, int start) {if (path.size() == k) {res.add(path);path.clear();return;}for (int i = start; i <= n; i++) {path.add(i);backtrack(n,k,i+1);path.removeLast();}}
}

由于后面有回溯的操作,所以根本不用清空path,每次把path的副本添加到结果列表中。

ArrayList使用removeLast充当pop,new ArrayList<>(path)创建副本。

class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> path = new ArrayList<>();public List<List<Integer>> combine(int n, int k) {backtrack(n,k,1);return res;}void backtrack(int n, int k, int start) {if (path.size() == k) {res.add(new ArrayList<>(path));return;}for (int i = start; i <= n; i++) {path.add(i);backtrack(n,k,i+1);path.removeLast();}}
}

77. 组合优化

采用剪枝操作减少不必要的穷举:在当前的组合路径 path 中已经有了 path.size() 个元素时,还需要选择 k - path.size() 个元素。当 i 的取值为 n - (k - path.size()) + 1 时,即使后面的数字全都选上,也凑不够 k 个元素,所以循环就可以结束了,不需要再继续遍历了。因此,使用 n - (k - path.size()) + 1 作为循环的结束条件,可以避免不必要的遍历,提高效率。

class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> path = new ArrayList<>();public List<List<Integer>> combine(int n, int k) {backtrack(n,k,1);return res;}void backtrack(int n, int k, int start) {if (path.size() == k) {res.add(new ArrayList<>(path));return;}for (int i = start; i <=n - (k - path.size()) + 1; i++) {path.add(i);backtrack(n,k,i+1);path.removeLast();}}
}

216.组合总和III

看完发现是k数之和,可以用前面的题魔改(在path满了的时候顺手判断下和是否符合要求),并且已经知道了递归树宽度为9。

class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> path = new ArrayList<>();public List<List<Integer>> combinationSum3(int k, int n) {backtrack(n,k,1,0);return res;}void backtrack(int target, int k, int start, int sum) {if (path.size() == k) {if (sum == target) res.add(new ArrayList<>(path));return;}for (int i = start; i <= 9; i++) {path.add(i);sum += i;backtrack(target, k, i+1,sum);path.removeLast();sum -= i;}}
}

这道题的剪枝有两点,首先可以模仿组合优化把for循环里的i边界改了,同时如果发现sum比target大后可以直接return。

class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> path = new ArrayList<>();public List<List<Integer>> combinationSum3(int k, int n) {backtrack(n,k,1,0);return res;}void backtrack(int target, int k, int start, int sum) {if (sum > target) return;if (path.size() == k) {if (sum == target) res.add(new ArrayList<>(path));return;}for (int i = start; i <= 9 - (k - path.size()) + 1; i++) {path.add(i);sum += i;backtrack(target, k, i+1,sum);path.removeLast();sum -= i;}}
}

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

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

相关文章

HCIA-HarmonyOS设备开发认证V2.0-3.2.轻量系统内核基础-时间管理

目录 一、时间管理1.1、时间接口1.2、代码分析&#xff08;待续...&#xff09; 一、时间管理 时间管理以系统时钟为基础&#xff0c;给应用程序提供所有和时间有关的服务。系统时钟是由定时器/计数器产生的输出脉冲触发中断产生的&#xff0c;一般定义为整数或长整数。输出脉…

关于推挽电路的说明

推挽电路,是一个我们时常遇到的一种电路,或者听过的一种电路,比如设置单片机的输出模式时,就有推挽输出这种选项。 由双极型晶体管即三极管组成的推挽电路基本上就是下图所示。 而推完的路径无非就是两种,如图示: 具体的输入输出原理就不说了,这里有一个及其关键的问题…

vue3-应用规模化-单文件组件

单文件组件概念 Vue 的单文件组件 (即 *.vue 文件&#xff0c;英文 Single-File Component&#xff0c;简称 SFC) 是一种特殊的文件格式&#xff0c;使我们能够将一个 Vue 组件的模板、逻辑与样式封装在单个文件中。下面是一个单文件组件的示例&#xff1a; <script setup…

【JavaScrpt 漫游】【015】JSON 对象简记

文章简介 本文为【JavaScript 漫游】专栏的第 015 篇文章&#xff0c;主要是对 JS 语言中的 JSON 对象的知识点进行了简要记录。 JSON 格式JSON 对象JSON.stringify()JSON.parse() JSON 格式 JSON 格式&#xff08;JavaScript Object Notation 的缩写&#xff09;是一种用于…

4.5 Binance_interface APP 币本位合约交易-基础订单

Binance_interface APP 币本位合约交易-基础订单 Github地址PyTed量化交易研究院 量化交易研究群(VX) py_ted目录 Binance_interface APP 币本位合约交易-基础订单1. APP 币本位合约交易-基础订单函数总览2. 模型实例化3. 下单&#xff08;API原始接口&#xff09; set_orde…

【原创 附源码】Flutter安卓及iOS海外登录--Google登录最详细流程

最近接触了几个海外登录的平台&#xff0c;踩了很多坑&#xff0c;也总结了很多东西&#xff0c;决定记录下来给路过的兄弟坐个参考&#xff0c;也留着以后留着回顾。更新时间为2024年2月8日&#xff0c;后续集成方式可能会有变动&#xff0c;所以目前的集成流程仅供参考&#…

Linux第49步_移植ST公司的linux内核第1步_获取linux源码

已知ST公司的linux源码路径&#xff1a; /home/zgq/linux/atk-mp1/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/linux-stm32mp-5.4.31-r0 1、创建“my_linux”目录 打开第1个终端 输入“ls回车” 输入“cd linux/回车”&#xff0c;切换…

字符串的解码--leetcode 394

参考题目如下&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目&#xff1a; 给定一个经过编码的字符串&#xff0c;返回它解码后的字符串。编码规则为: k[encoded_string]&#xff0c;表示其中方括号内部的 encoded_string 正好重复…

iOS swift XHToast.showCenterWithText不显示

extension UIWindow {fileprivate class func window() -> UIWindow{ // let window UIApplication.shared.windows.last! 这是原来的代码let window UIApplication.shared.keyWindow! //这是修改后的代码&#xff08;亲测有效&#xff0c;可以正常显示&#xff0…

Atcoder ABC339 A-D题解

除夕晚上的比赛&#xff0c;傻子才打。 Problem A: 简单题。但是相比于之前的A题来说还是变难了。直接上代码: #include <bits/stdc.h> using namespace std; int main(){string str;cin>>str;int pos-1;for(int i1;i<str.size();i){if(str[i].)posi;}cout&l…

使用阿里云通义千问14B(Qianwen-14B)模型自建问答系统

使用阿里云通义千问14B&#xff08;Qianwen-14B&#xff09;模型自建问答系统时&#xff0c;调度服务器资源的详情将取决于以下关键因素&#xff1a; 模型部署&#xff1a; GPU资源&#xff1a;由于Qianwen-14B是一个大规模语言模型&#xff0c;推理时需要高性能的GPU支持。模型…

IDEA Ultimate下载(采用JetBrain学生认证)

IDEA Ultimate版本下载 Ulitmate是无限制版&#xff08;解锁所有插件&#xff0c;正版需要付费。学生可以免费申请许可&#xff09;Community是开源社区版本&#xff08;部分插件不提供使用&#xff0c;比如Tomcat插件。免费&#xff09; 我们将通过学生认证获取免费版。 Je…

例38:使用Frame(分组框)

建立一个EXE工程&#xff0c;在窗体上放两个Frame框。分别放两组单选按钮表示性别和收入&#xff0c;注意每组单选按钮的组名要一样。在按钮中输入代码&#xff1a; Sub Form1_Command1_BN_Clicked(hWndForm As hWnd, hWndControl As hWnd)If Frame1.Visible ThenFrame1.Visib…

[算法学习] 逆元与欧拉降幂

费马小定理 两个条件&#xff1a; p为质数a与p互质 逆元 如果要求 x^-1 mod p &#xff0c;用快速幂求 qmi(x,p-2) 就好 欧拉函数 思路&#xff1a;找到因数 i&#xff0c;phi / i * (i-1)&#xff0c;除干净&#xff0c;判断最后的n 欧拉降幂 欧拉定理 应用示例 m! 是一个…

【实战】一、Jest 前端自动化测试框架基础入门 —— 前端要学的测试课 从Jest入门到TDD BDD双实战(一)

文章目录 一、前端要学的测试课1.前端要学的测试2.前端工程化的一部分3.前端自动化测试的例子4.前端为什么需要自动化测试&#xff1f;5.课程涵盖内容6.前置技能7.学习收获 二、Jest 前端自动化测试框架基础入门1. 自动化测试背景及原理前端自动化测试产生的背景及原理 2.前端自…

【JVM篇】ThreadLocal中为什么要使用弱引用

文章目录 &#x1f354;ThreadLocal中为什么要使用弱引用⭐总结 &#x1f354;ThreadLocal中为什么要使用弱引用 ThreadLocal可以在线程中存放线程的本地变量&#xff0c;保证数据的线程安全 ThreadLocal是这样子保存对象的&#xff1a; 在每个线程中&#xff0c;存放了一个…

2024牛客寒假算法基础集训营3

前言 感觉有些题是有难度&#xff0c;但是是我花时间想能想的出来的题目&#xff0c;总体来说做的很爽&#xff0c;题目也不错。个人总结了几个做题技巧&#xff0c;也算是提醒自己。 1.多分类讨论 2.从特殊到一般&#xff0c;便于找规律。例如有一组数&#xff0c;有奇数和…

【嵌入式-定时器】通过呼吸灯案例使用逻辑分析仪分析PWM波形

目的&#xff1a;通过实现呼吸灯分析PWM波形 代码&#xff1a; PWM.c #include "stm32f10x.h" // Device header/*** brief PWM初始化* param 无* retval 无 */ void PWM_Init(void) {// 使能IO和TIM2RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM…

基于python和matlab的复杂函数拟合的方法、工具以及学习资料

复杂函数拟合是指对具有复杂形式的函数进行拟合,例如积分函数、微分方程、偏微分函数、隐函数、方程组的拟合,通常涉及到非线性、多变量、高维度、高阶、多参数等情况。在实际应用中,复杂函数拟合常常需要结合不同的拟合方法和工具来实现。下面我们将列举常见的复杂函数拟合…

错误的集合(力扣刷题)

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 由于作者比较菜&#xff0c;还没学malloc这个函数&#xff0c;因此这个题目只写一些与原题大致的思路。 题目链接&#xff1a;645. 错误的集合 - 力扣…