代码随想录-算法训练营day29(回溯算法05:非递减子序列,全排列,全排列2)

news/2024/12/4 15:07:48/
第七章 回溯算法part05* 491.递增子序列
* 46.全排列
* 47.全排列 II详细布置 491.递增子序列 本题和大家刚做过的 90.子集II 非常像,但又很不一样,很容易掉坑里。 
https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F%E5%88%97.html 视频讲解:https://www.bilibili.com/video/BV1EG4y1h78v  46.全排列 
本题重点感受一下,排列问题 与 组合问题,组合总和,子集问题的区别。 为什么排列问题不用 startIndex 
https://programmercarl.com/0046.%E5%85%A8%E6%8E%92%E5%88%97.html   
视频讲解:https://www.bilibili.com/video/BV19v4y1S79W  47.全排列 II 
本题 就是我们讲过的 40.组合总和II 去重逻辑 和 46.全排列 的结合,可以先自己做一下,然后重点看一下 文章中 我讲的拓展内容。 used[i - 1] == true 也行,used[i - 1] == false 也行 https://programmercarl.com/0047.%E5%85%A8%E6%8E%92%E5%88%97II.html     视频讲解:https://www.bilibili.com/video/BV1R84y1i7Tm往日任务
● day 1 任务以及具体安排:https://docs.qq.com/doc/DUG9UR2ZUc3BjRUdY  
● day 2 任务以及具体安排:https://docs.qq.com/doc/DUGRwWXNOVEpyaVpG  
● day 3 任务以及具体安排:https://docs.qq.com/doc/DUGdqYWNYeGhlaVR6 
● day 4 任务以及具体安排:https://docs.qq.com/doc/DUFNjYUxYRHRVWklp 
● day 5 周日休息
● day 6 任务以及具体安排:https://docs.qq.com/doc/DUEtFSGdreWRuR2p4 
● day 7 任务以及具体安排:https://docs.qq.com/doc/DUElCb1NyTVpXa0Jj 
● day 8 任务以及具体安排:https://docs.qq.com/doc/DUGdsY2JFaFhDRVZH 
● day 9 任务以及具体安排:https://docs.qq.com/doc/DUHVXSnZNaXpVUHN4 
● day 10 任务以及具体安排:https://docs.qq.com/doc/DUElqeHh3cndDbW1Q 
●day 11 任务以及具体安排:https://docs.qq.com/doc/DUHh6UE5hUUZOZUd0 
●day 12 周日休息 
●day 13 任务以及具体安排:https://docs.qq.com/doc/DUHNpa3F4b2dMUWJ3 
●day 14 任务以及具体安排:https://docs.qq.com/doc/DUHRtdXZZSWFkeGdE 
●day 15 任务以及具体安排:https://docs.qq.com/doc/DUHN0ZVJuRmVYeWNv 
●day 16 任务以及具体安排:https://docs.qq.com/doc/DUHBQRm1aSWR4T2NK 
●day 17 任务以及具体安排:https://docs.qq.com/doc/DUFpXY3hBZkpabWFY 
●day 18 任务以及具体安排:https://docs.qq.com/doc/DUFFiVHl3YVlReVlr 
●day 19 周日休息
●day 20 任务以及具体安排:https://docs.qq.com/doc/DUGFRU2V6Z1F4alBH  
●day 21 任务以及具体安排:https://docs.qq.com/doc/DUHl2SGNvZmxqZm1X 
●day 22 任务以及具体安排:https://docs.qq.com/doc/DUHplVUp5YnN1bnBL  
●day 23 任务以及具体安排:https://docs.qq.com/doc/DUFBUQmxpQU1pa29C 
●day 24 任务以及具体安排:https://docs.qq.com/doc/DUEhsb0pUUm1WT2NP  
●day 25 任务以及具体安排:https://docs.qq.com/doc/DUExTYXVzU1BiU2Zl 
●day 26 休息 
●day 27 任务以及具体安排:https://docs.qq.com/doc/DUElpbnNUR3hIbXlY 
●day 28 任务以及具体安排:https://docs.qq.com/doc/DUG1yVHdlWEdNYlhZ

day29

非递减子序列

 //关键在于不能排序,所以使用哈希法去重//树枝上收集结果而不是仅在子叶上,所以一进入回溯函数就收割结果,而且不return,继续往后延伸树枝//在for循环外面新建hashset或者hash数组,只管树层上的去重class Solution {private List<Integer> path = new ArrayList<>();private List<List<Integer>> res = new ArrayList<>();public List<List<Integer>> findSubsequences(int[] nums) {backtracking(nums,0);return res;}​private void backtracking (int[] nums, int start) {if (path.size() > 1) {res.add(new ArrayList<>(path));//至少两个}int[] used = new int[201];//本体题不能排序,用哈希法的数组表现形式去重//for循环外面新建,只针对本层for循环不能出现重复元素,也就是只在本树层去重,进入下一层的时候used会更新,所以树枝不去重for (int i = start; i < nums.length; i++) {if (!path.isEmpty() && nums[i] < path.get(path.size() - 1) ||(used[nums[i] + 100] == 1)) continue;//如果加进来的数字小,继续;如果加进来得数字相等,看看是在树层还是在树枝;//used[nums[i] + 100] == 1 说明本树层上已经用过了,就不能用了;//如果是在树枝上,因为已经进入了新的回溯函数,所以nums已经重置了,used[nums[i] + 100] == 0,就可以加进去used[nums[i] + 100] = 1;//本层此数用过了path.add(nums[i]);backtracking(nums, i + 1);path.remove(path.size() - 1);}}}

全排列

 class Solution {List<List<Integer>> result = new ArrayList<>();List<Integer> path = new ArrayList<>();int[] used;//元素个数确定,数组也行,不对不行,要用path.size==nums.length去判断结束,只能用Listpublic List<List<Integer>> permute(int[] nums) {//子叶上收集,判断深度方向上结束后收割used = new int[nums.length];backtricking(nums,0);return result;}private void backtricking(int[] nums,int index){if(path.size() == nums.length) {result.add(new ArrayList(path));}for(int i=0;i<nums.length; i++){if(used[i] != 0 ) continue;used[i] = 1;path.add(nums[i]);index++;backtricking(nums,index);index--;path.remove(path.size() - 1);used[i]=0;}}}

全排列2

 //只是全排列的基础上加了去重的判断class Solution {List<List<Integer>> result = new ArrayList<>();List<Integer> path = new ArrayList<>();int[] used;//元素个数确定,数组也行,不对不行,要用path.size==nums.length去判断结束,只能用Listpublic List<List<Integer>> permuteUnique(int[] nums) {//子叶上收集,判断深度方向上结束后收割used = new int[nums.length];Arrays.sort(nums);backtricking(nums,0);return result;}private void backtricking(int[] nums,int index){if(path.size() == nums.length) {result.add(new ArrayList(path));}for(int i=0;i<nums.length; i++){if(used[i] != 0 || (i>0 && nums[i] == nums[i-1] && used[i-1] == 0) ) continue;// used[i - 1] == true,说明同⼀树⽀nums[i - 1]使⽤过// used[i - 1] == false,说明同⼀树层nums[i - 1]使⽤过// 只是全排列的基础上加了去重的判断used[i] = 1;path.add(nums[i]);index++;backtricking(nums,index);index--;path.remove(path.size() - 1);used[i]=0;}}}

感谢大佬分享:

代码随想录-算法训练营day29【回溯算法05:递增子序列、全排列】-CSDN博客


http://www.ppmy.cn/news/1552307.html

相关文章

Python 入门教程(2)搭建环境 | 2.4、VSCode配置Node.js运行环境

文章目录 一、VSCode配置Node.js运行环境1、软件安装2、安装Node.js插件3、配置VSCode4、创建并运行Node.js文件5、调试Node.js代码 一、VSCode配置Node.js运行环境 1、软件安装 安装下面的软件&#xff1a; 安装Node.js&#xff1a;Node.js官网 下载Node.js安装包。建议选择L…

【Go底层】select原理

目录 1、背景2、go版本3、 selectgo函数解释【1】函数参数解释【2】函数具体解释第一步&#xff1a;遍历pollorder&#xff0c;选出准备好的case第二步&#xff1a;将当前goroutine放到所有case通道中对应的收发队列上第三步&#xff1a;唤醒groutine 4、总结 1、背景 select多…

SpringBoot 框架下基于 MVC 的高校办公室行政事务管理系统:设计开发全解析

2系统开发环境 2.1vue技术 Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式JavaScript框架。 [5] 与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第…

2024.12.2工作复盘

1.今天学了什么&#xff1f; 简单的写了一篇博客&#xff0c;是关于参数校验的问题&#xff0c;参数校验&#xff0c;一个是前后端校验到底一不一致&#xff0c;一个是绕过前端校验&#xff0c;看后台的逻辑到底能不能校验住。 2.今天解决了什么问题&#xff1f; 3.今天完成…

数据结构实训——排序

声明&#xff1a; 以下是我们学校在学习数据结构时进行的实训&#xff0c;如涉及侵权马上删除文章 声明&#xff1a;本文主要用作技术分享&#xff0c;所有内容仅供参考。任何使用或依赖于本文信息所造成的法律后果均与本人无关。请读者自行判断风险&#xff0c;并遵循相关法…

Figma入门-自动布局

Figma入门-自动布局 前言 在之前的工作中&#xff0c;大家的原型图都是使用 Axure 制作的&#xff0c;印象中 Figma 一直是个专业设计软件。 最近&#xff0c;很多产品朋友告诉我&#xff0c;很多原型图都开始用Figma制作了&#xff0c;并且很多组件都是内置的&#xff0c;对…

Argon2-cffi:Python中的密码学哈希库

简介 Argon2-cffi是一个Python库&#xff0c;它提供了对Argon2密码学哈希算法的接口。Argon2是一种专为密码哈希设计的算法&#xff0c;它在2015年的Password Hashing Competition中获胜&#xff0c;因其安全性和效率而被广泛推荐用于密码存储。 GitHub地址 Argon2-cffi的GitHu…

Web开发基础学习——HTML, CSS, JavaScript 的区别和联系

Web开发基础学习系列文章目录 第一章 基础知识学习之HTML, CSS, JavaScript 的区别和联系 文章目录 Web开发基础学习系列文章目录前言一、定义说白了&#xff0c;就是HTML负责网页的内容&#xff0c;CSS负责网页的格式&#xff0c;JS负责网页的交互。 二、 功能三、联系四、示…