day29 回溯part5

491. 非递减子序列

中等
给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。
数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况
在这里插入图片描述

在这里插入图片描述

class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> path = new ArrayList<>();public List<List<Integer>> findSubsequences(int[] nums) {backtrack(nums, 0);return res;}public void backtrack(int nums[], int start) {if (path.size() >= 2) {res.add(new ArrayList<>(path));}// 借助 set 对 [idx + 1, nums.length - 1] 范围内的数去重Set<Integer> set = new HashSet<>(); //每个循环里都会有一个这个哈希表,不用担心别的分支层的哈希表影响到这个地方的哈希表for (int i = start; i < nums.length; i++) {if (!path.isEmpty() && nums[i] < path.get(path.size() - 1)) {continue; // 如果这个数比上个数小,那就不是递增了}if (set.contains(nums[i])) {continue; // 如果这一层已经用过这个数了,那就砍掉这个分支}set.add(nums[i]);path.add(nums[i]);backtrack(nums, i + 1);path.remove(path.size() - 1);}}
}

46. 全排列

中等
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案
在这里插入图片描述

难点:每次都会延伸出nums.length个分支,只不过都被砍了(见上图),整个算法复杂度很高,所以提示:1 <= nums.length <= 6

class Solution {List<List<Integer>> res = new ArrayList<>();LinkedList<Integer> path = new LinkedList<>();public List<List<Integer>> permute(int[] nums) {backtrack(nums);return res;}public void backtrack(int[] nums) {if (path.size() == nums.length) {res.add(new ArrayList<>(path));return;}for (int i = 0; i < nums.length; i++) {if (path.contains(nums[i])) {continue;}path.add(nums[i]);backtrack(nums);path.remove(path.size() - 1);}}
}

47. 全排列 II

中等
相关标签
相关企业
给定一个可包含重复数字的序列 ,按任意顺序 返回所有不重复的全排列。

class Solution {List<List<Integer>> res = new ArrayList<>();LinkedList<Integer> path = new LinkedList<>();boolean[] used;public List<List<Integer>> permuteUnique(int[] nums) {used = new boolean[nums.length];Arrays.fill(used, false); // 全部填充为falseArrays.sort(nums);backtrack(nums);return res;}public void backtrack(int[] nums) {if (path.size() == nums.length) {res.add(new ArrayList<>(path));return;}for (int i = 0; i < nums.length; i++) {if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) {continue; // used[i - 1] == false做得是树层上的去重,因为,当前数等于前一个数,而且前一个数标记为false,说明它已经被使用过了,如果它是true,说明在它的这个树枝里} // used[i - 1] == true 做得是树枝上的去重if (used[i] == false) {path.add(nums[i]);used[i] = true;backtrack(nums);path.remove(path.size() - 1);used[i] = false;}}}
}

难点:这个题,有树枝去重和树层去重两种方式,可以仔细思考,推荐树层去重,更高效

树层去重:used[i - 1] == false
在这里插入图片描述

树枝去重:used[i - 1] == true
在这里插入图片描述

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

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

相关文章

【Python】通过conda安装Python的IDE

背景 系统&#xff1a;win11 软件&#xff1a;anaconda Navigator 问题现象&#xff1a;①使用Navigator安装jupyter notebook以及Spyder IDE 一直转圈。②然后进入anaconda prompt执行conda install jupyter notebook一直卡在Solving environment/-\。 类似问题&#xff1a; …

大学建筑专业的搜题软件?大学搜题工具中的高级搜索功能有哪些? #学习方法#微信#经验分享

学习和考试是大学生生活中不可避免的一部分&#xff0c;而在这个信息爆炸的时代&#xff0c;如何快速有效地获取学习资源和解答问题成为了大学生们共同面临的难题。为了解决这个问题&#xff0c;搜题和学习软件应运而生。今天&#xff0c;我将为大家介绍几款备受大学生青睐的搜…

线程池(图解,本质,模拟实现代码)

目录 线程池 介绍 图解 过程 本质 模拟实现 思路 注意点 解决方法 代码 pthread_pool.hpp task.hpp main.cpp 示例 线程池 介绍 线程池是一种并发编程的设计模式&#xff0c;用于管理和重复使用线程&#xff0c;以提高多线程应用程序的性能和效率 线程池主要用于…

【C++】C++11上

C11上 1.C11简介2.统一的列表初始化2.1 {} 初始化2.2 initializer_list 3.变量类型推导3.1auto3.2decltype3.3nullptr 4.范围for循环5.final与override6.智能指针7. STL中一些变化8.右值引用和移动语义8.1左值引用和右值引用8.2左值引用与右值引用比较8.3右值引用使用场景和意义…

【网站项目】023实验室耗材管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Spring中的事务实现、失效场景即AOP的相关概念理解

spring实现事务&#xff08;声明式事务&#xff09;的本质就是aop完成的,它会对方法的前后进行拦截,在执行方法之前开启事务,在执行完目标方法之后根据执行情况提交或回滚事务。aop就是面向切面编程&#xff0c;在spring中将那些与业务无关&#xff0c;但却对多个对象产生影响的…

STM32,嵌入式系统中的I2C协议

I2C协议——读写EEPROM 关注我&#xff0c;共同交流&#xff0c;一起成长 前言一、协议简介二、I2C特性及架构三、通信过程 前言 这是一种主要用于集成电路和集成电路&#xff08;IC&#xff09;通信&#xff0c;计算机中复杂的问题大多数就是用分层来进行解决&#xff0c;这个…

关于内存相关的梳理

1 关键字 总结 &#xff08;lowmemory&#xff0c;anr in&#xff09; 2 知识储备 虚拟机原理 垃圾回收算法 又包含标记 和清除两种算法 标记&#xff1a;程序计数器-已过时&#xff0c;可达性分析 具体可见 http://help.eclipse.org/luna/index.jsp?topic%2Forg.ec…

什么是 Docker 容器?以及操作 Docker 容器相关的命令汇总

镜像仓库常用指令&#xff1a;Docker 镜像仓库是什么&#xff1f;有哪些镜像仓库命令&#xff1f; 镜像常用指令&#xff1a;操作 Docker 镜像的常用命令 1. 什么是容器&#xff1f; 容器是镜像的运行实体。容器是基于镜像创建的可运行实例&#xff0c;并且单独存在&#xff0…

打字侠网站,提供免费的双拼打字练习

在当今信息时代&#xff0c;电脑已成为人们生活、学习和工作不可或缺的一部分。随着电脑的普及和广泛应用&#xff0c;打字成了一项必备的技能&#xff0c;尤其是对于从事编程和写作等工作的人来说甚至更为重要。而要想提高打字速度和准确度&#xff0c;良好的打字练习是必不可…

BMS再进阶(新能源汽车电池管理系统)

引言 一文入门BMS&#xff08;电池管理系统&#xff09;_bms电池管理-CSDN博客 BMS进阶&#xff08;Type-C、PD快充、充电IC、SOC算法、电池管理IC&#xff09;_充电ic asi aso功能-CSDN博客 本文是上面两篇博客的续篇&#xff0c;之前都是讲解一些BMS基本原理&#xff0c;…