代码随想录day22:回溯part4

ops/2024/10/9 9:03:33/

491.递增子序列

class Solution {List<List<Integer>> result = new ArrayList<>();List<Integer> path = new ArrayList<>();public List<List<Integer>> findSubsequences(int[] nums) {backTracking(nums, 0);return result;}private void backTracking(int[] nums, int startIndex){if(path.size() >= 2)result.add(new ArrayList<>(path));            HashSet<Integer> hs = new HashSet<>();for(int i = startIndex; i < nums.length; i++){if(!path.isEmpty() && path.get(path.size() -1 ) > nums[i] || hs.contains(nums[i]))continue;hs.add(nums[i]);path.add(nums[i]);backTracking(nums, i + 1);path.remove(path.size() - 1);}}
}

对于已经习惯写回溯的同学,看到递归函数上面的uset.insert(nums[i]);,下面却没有对应的pop之类的操作,应该很不习惯吧

这也是需要注意的点,unordered_set<int> uset; 是记录本层元素是否重复使用,新的一层uset都会重新定义(清空),所以要知道uset只负责本层!

46.全排列

排列问题是用used数组树枝去重;组合问题(无重复元素)的用startIndex去重,有重复元素的要做数层去重(used数组或者hashset)

class Solution {List<List<Integer>> result = new ArrayList<>();// 存放符合条件结果的集合LinkedList<Integer> path = new LinkedList<>();// 用来存放符合条件结果boolean[] used;public List<List<Integer>> permute(int[] nums) {if (nums.length == 0){return result;}used = new boolean[nums.length];permuteHelper(nums);return result;}private void permuteHelper(int[] nums){if (path.size() == nums.length){result.add(new ArrayList<>(path));return;}for (int i = 0; i < nums.length; i++){if (used[i]){continue;}used[i] = true;path.add(nums[i]);permuteHelper(nums);path.removeLast();used[i] = false;}}
}

47.全排列 II

class Solution {//存放结果List<List<Integer>> result = new ArrayList<>();//暂存结果List<Integer> path = new ArrayList<>();public List<List<Integer>> permuteUnique(int[] nums) {boolean[] used = new boolean[nums.length];Arrays.fill(used, false);Arrays.sort(nums);backTrack(nums, used);return result;}private void backTrack(int[] nums, boolean[] used) {if (path.size() == nums.length) {result.add(new ArrayList<>(path));return;}for (int i = 0; i < nums.length; i++) {// used[i - 1] == true,说明同⼀树⽀nums[i - 1]使⽤过// used[i - 1] == false,说明同⼀树层nums[i - 1]使⽤过// 如果同⼀树层nums[i - 1]使⽤过则直接跳过if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) {continue;}//如果同⼀树⽀nums[i]没使⽤过开始处理if (used[i] == false) {used[i] = true;//标记同⼀树⽀nums[i]使⽤过,防止同一树枝重复使用path.add(nums[i]);backTrack(nums, used);path.remove(path.size() - 1);//回溯,说明同⼀树层nums[i]使⽤过,防止下一树层重复used[i] = false;//回溯}}}
}

回溯总结


http://www.ppmy.cn/ops/123099.html

相关文章

vue快速上手

文章目录 vue快速上手vue简述框架介绍mvvm vue使用1.npm2.vue cli1.打开 vue 官网2.快速上手3.切换目录到我们创建的应用位置&#xff0c;安装依赖3.运行vue项目 vue快速上手 vue简述 框架介绍 mvvm vue使用 1.npm 包管理器 安装nodejs就好了 2.vue cli 1.打开 vue 官网…

OJ在线评测系统 思考如何进行微服务的划分 业务功能 占用端口 公共服务 依赖服务 路由

思考 微服务是一种架构风格 微服务就是把一个项目拆分成多个独立的不封 而且多个服务都是可以运行的 每个服务都会占用线程 传统的IT行业软件都是独立系统的堆砌 这些系统总结来说就是可拓展性不高 可靠性不高 维护成本广告 微服务的每个模块都是独立的 而且可以用有多重存…

【中间件】fastDFS的相关知识

一、分布式文件系统 1.1 传统的文件系统 我们在Linux中学习的文件系统就是传统的文件系统&#xff1a; 传统的文件系统格式&#xff1a; ntfs/fat32/ext3/ext4 可以被挂载和卸载&#xff0c;就是一般一个盘可以分成多个盘&#xff0c;每一盘都可以挂载到不同的目录路径中。…

鸿蒙 Next 实战: 电子木鱼

前言 正所谓&#xff1a;Hello Word 是程序员学任何一门语言的第一个程序实践。这其实也是一个不错的正反馈&#xff0c;那如何让学习鸿蒙 Next 更有成就感呢&#xff1f;下面就演示一下从零开发一个鸿蒙 Next 版的电子木鱼&#xff0c;主打就是一个抽象&#xff01; 实现要点…

使用docker搭建zk集群

使用zk搭建一个3节点的zk集群&#xff0c;网络方式为host。 配置节点1 # 创建一个目录 /root/lyl/zookeeper/zk1创建文件myid&#xff0c;文件内容如下&#xff1a; 1 创建文件zoo.cfg&#xff0c;文件内容如下&#xff1a; # The number of milliseconds of each tick ti…

EEPROM通讯设计思路

GD32E507的I2C接口&#xff08;采用复用的GPIO&#xff09;与EEPROM 24LC16通讯&#xff0c;从软件设计角度&#xff0c;从0开始到最终完成主要需要经过以下几个步骤&#xff1a; 一、硬件连接与配置 硬件接口连接 将EEPROM 24LC16的SCL&#xff08;时钟线&#xff09;和SDA&a…

HDFS Shell作业1

1.在HDFS上建立/user/stu/自己学号&#xff0c;和/user/stu/input目录。 命令&#xff1a; hdfs dfs -mkdir -p /user/stu/22 hdfs dfs -mkdir /user/stu/input 2.用两种不同的方法上传albums.csv至HDFS的学号目录和input目录中。 命令&#xff1a; hdfs dfs -put par…

Python OpenCV精讲系列 - 三维重建深入理解(十七)

&#x1f496;&#x1f496;⚡️⚡️专栏&#xff1a;Python OpenCV精讲⚡️⚡️&#x1f496;&#x1f496; 本专栏聚焦于Python结合OpenCV库进行计算机视觉开发的专业教程。通过系统化的课程设计&#xff0c;从基础概念入手&#xff0c;逐步深入到图像处理、特征检测、物体识…