【代码随想录算法训练营Day29】 491.递增子序列;46.全排列;47.全排列 II

文章目录

  • ❇️Day 29 第七章 回溯算法 part05
    • ✴️今日内容
    • ❇️491.递增子序列
      • 自己的思路
      • 随想录思路
      • 自己的代码
    • ❇️46.全排列
      • 思路
      • 代码
      • 流程
    • ❇️47.全排列 II
      • 思路
      • 代码

❇️Day 29 第七章 回溯算法 part05

✴️今日内容

  • 491.递增子序列
  • 46.全排列
  • 47.全排列 II

❇️491.递增子序列

  • 本题和大家刚做过的 90.子集II 非常像,但又很不一样,很容易掉坑里。
  • 题目链接:https://leetcode.cn/problems/non-decreasing-subsequences/
  • 视频讲解:https://www.bilibili.com/video/BV1EG4y1h78v
  • 文章链接:https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F%E5%88%97.html

自己的思路

  1. 先给数组排序
  2. 使用visited数组判断相同数是否被访问过
  3. 当nums长度大等于2时添加到res中
  4. 去重:因为不能排序,所以去重更复杂了,用visited不能通过了

随想录思路

在这里插入图片描述

所以要从集合中判断当前数在前面的集合中有没有出现过,所以自然想到哈希表,

  1. 创建一个set
  2. 每取一个元素就把元素放到set中

自己的代码

class Solution {List<List<Integer>> res = new ArrayList<>();LinkedList<Integer> path = new LinkedList<>();public List<List<Integer>> findSubsequences(int[] nums) {dfs(nums, 0);return res;}public void dfs(int[] nums, int start){if(path.size() >= 2){res.add(new ArrayList<>(path));}//子集问题可以省掉终止条件因为当start >= nums.length时不会进入for循环//if(start >= nums.length) return;//在每一个for循环前定义一个set来表示已经被选过数的集合HashSet<Integer> usedSet = new HashSet<>();for (int i = start; i < nums.length; i++) {if(!path.isEmpty() && path.get(path.size() - 1) > nums[i] || usedSet.contains(nums[i])) {continue;}usedSet.add(nums[i]);path.add(nums[i]);dfs(nums, i + 1);path.removeLast();}}
}

❇️46.全排列

  • 本题重点感受一下,排列问题 与 组合问题,组合总和,子集问题的区别。 为什么排列问题不用 startIndex
  • 题目链接:https://leetcode.cn/problems/permutations/
  • 视频讲解:https://www.bilibili.com/video/BV19v4y1S79W
  • 文章链接:https://programmercarl.com/0046.%E5%85%A8%E6%8E%92%E5%88%97.html

思路

先固定数组中的一个值,然后再固定排列剩下的值
所以需要一个参数来表示数组中的数有没有被固定

代码

public static List<List<Integer>> permute(int[] nums) {List<List<Integer>> res = new ArrayList<>();dfs(nums, new boolean[nums.length], new LinkedList<>(), res);return res;
}
public static void dfs(int[] nums, boolean[] visited, LinkedList<Integer> stack, List<List<Integer>> res){//结束条件if(stack.size() == nums.length){res.add(new ArrayList<>(stack));return;}//遍历nums数组,发现没有被使用的数字,则将其标记为使用,并加入stackfor (int i = 0; i < nums.length; i++) {if (!visited[i]) {stack.push(nums[i]);visited[i] = true;dfs(nums, visited, stack, res);//回溯visited[i] = false;stack.pop();}}
}

流程

[图片]

❇️47.全排列 II

  • 本题 就是我们讲过的 40.组合总和II 去重逻辑 和 46.全排列 的结合,可以先自己做一下,然后重点看一下 文章中 我讲的拓展内容。 used[i - 1] == true 也行,used[i - 1] == false 也行
  • 题目链接:https://leetcode.cn/problems/permutations-ii/
  • 视频讲解:https://www.bilibili.com/video/BV1R84y1i7Tm
  • 文章链接:https://programmercarl.com/0047.%E5%85%A8%E6%8E%92%E5%88%97II.html

思路

规定:遇到相同的几个数,先固定第一个,再固定第二个
这样做就需要给数组排个序使相同的数字挨在一起
这种操作也叫剪枝

代码

public static List<List<Integer>> permuteUnique(int[] nums) {List<List<Integer>> res = new ArrayList<>();dfs(nums, new boolean[nums.length], new LinkedList<>(), res);return res;
}
public static void dfs(int[] nums, boolean[] visited, LinkedList<Integer> stack, List<List<Integer>> res){//结束条件if(stack.size() == nums.length){res.add(new ArrayList<>(stack));return;}//遍历nums数组,发现没有被使用的数字,则将其标记为使用,并加入stackfor (int i = 0; i < nums.length; i++) {//▶️找出重复的数字,且上一个与当前数字相等的数字没有被固定则跳过当前循环if(i > 0 && nums[i] == nums[i - 1] && !visited[i - 1]){continue;}if (!visited[i]) {stack.push(nums[i]);visited[i] = true;dfs(nums, visited, stack, res);//回溯visited[i] = false;stack.pop();}}
}

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

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

相关文章

【性能测试】Jmeter+InfluxDB+Grafana 搭建性能监控平台

一、背景 为什么要搭建性能监控平台&#xff1f; 在用 Jmeter 获取性能测试结果的时候&#xff0c;Jmeter自带的测试报告如下&#xff1a; 这个报告有几个很明显的缺点&#xff1a; 只能自己看&#xff0c;无法实时共享&#xff1b;报告信息的展示比较简陋单一&#xff0c;不…

在外包公司搞了2年,出来技术都没了...

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了2年的的功能…

网络工程师笔记9

动态路由 RIP路由协议 配置简单 易于维护 适用于小型网络 周期性是30s发一次

MyBatis-Plus如何娴熟运用乐观锁

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 MyBatis-Plus如何娴熟运用乐观锁 前言乐观锁的基本概念基本概念和原理&#xff1a;为何乐观锁是解决并发问题的有效手段&#xff1a; MyBatis-Plus中乐观锁的支持1. Version 注解&#xff1a;2. 配置乐…

严刑拷打_微服务

文章详情 &#xff1a;&#x1f60a; 作者&#xff1a;Lion J &#x1f496; 主页&#xff1a; https://blog.csdn.net/weixin_69252724 &#x1f389; 主题&#xff1a; 微服务相关知识 ⏱️ 创作时间&#xff1a;2024年03月8日 ———————————————— 文章目…

高级语言讲义2014计专(仅高级语言部分)

1. 已知&#xff0c;连续函数在区间[0, 3]有且只有一个实根&#xff0c;编写完整程序&#xff0c;利用二分法计算并输出该实根的近似值&#xff0c;要求结果精确到。 二分法的基本思路是:对于区间[a, b]上的连续函数f(x)&#xff0c;若f(a)和f(b)的正负号不同&#xff0c;则该区…

unicloud where 使用

where介绍 在uniCloud中&#xff0c;WHERE是一个用于指定查询条件的关键字。它允许用户根据特定的条件来筛选和查询云数据库中的数据。WHERE语句的基本语法格式是WHERE condition&#xff0c;其中condition表示查询条件&#xff0c;可以是一个或多个逻辑表达式组成的条件。 在…

达梦数据库将DMHR模式下的表(迁移)导出为EXCEL文件

数据库迁移工具&#xff08;Data Transfer Service&#xff09;位于/dm8/tool/dts.其中/dm8是数据库安装目录。 在创建数据库时我们如果勾选了 “创建示例库DMHR(R)”&#xff0c;数据库实例中就带有这个数据库。 这里是用MobaXterm客户端远程控制ip地址为192.168.148.130的虚…

【C++】C++11---右值引用和移动语义

目录 1、什么是左值引用和右值引用2、左值引用与右值引用比较3、右值引用使用场景和意义4、右值引用引用左值的分析5、完美转发 1、什么是左值引用和右值引用 传统的C语法中就有引用的语法&#xff0c;而C11中新增了的右值引用语法特性&#xff0c;所以从现在开始我们之前学习…

Xilinx 7系列 FPGA硬件知识系列(九)——FPGA的配置

目录 1 .1配置模式 1.1.1 主模式 1.1.2 从模式 1.2 7种配置模式 1.2.1 主串配置模式 1.2.2 从串配置模式 ​编辑1.2.3 主并配置模式 1.2.4 从并配置模式 1.2.5 JTAG配置模式 ​编辑1.2.6 主SPI配置模式 ​编辑1.2.7 主BPI配置模式 1.2.8 FPGA BPI加载时间…

详解float函数类型转换

函数描述 float([x]) 函数将数字或数字的字符串表示形式转换为与它等效的有符号浮点数。如果参数x是一个字符串&#xff08;十进制表示的数字串&#xff09;&#xff0c;数字前面可以添加符号来表示正数&#xff0c;或负数。符号和数字之间不能出现空格&#xff0c;但是符号前…

【Linux基础(三)】信号

学习分享 1、信号的基本概念2、查看信号列表3、常见信号名称4、signal库函数5、发送信号kill6、kill - signal &#xff08;无参信号&#xff09;示例6.1、kill - signal (不可靠信号)示例6.2、kill - signal (可靠信号)示例 7、信号分类7.1、信号运行原理分类7.2、信号是否携带…

java-抢红包一些简单概念

抢红包&#xff0c;比如微信中抢红包&#xff0c;红包金额分配使用的是二倍均值算法。 二倍均值拆包&#xff1a; 拆包要求:所有人抢到的金额之和等于红包总额&#xff0c;每个人最少抢到 0.01 元&#xff0c;每个人抢到的红包金额不要相差太大二倍均值法:假设红包总金额是X&…

【Spring云原生系列】Spring RabbitMQ:异步处理机制的基础--消息队列 原理讲解+使用教程

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &a…

3DES算法的起源与演进:保障信息安全的重要里程碑

title: 3DES算法的起源与演进&#xff1a;保障信息安全的重要里程碑 date: 2024/3/8 21:25:19 updated: 2024/3/8 21:25:19 tags: 3DES算法起源安全性增强三次迭代加密密钥管理复杂效率对比AES应用场景广泛Python实现示例 一、3DES算法的起源与演进 3DES算法是DES算法的增强版…

Linux第72步_使用“新字符设备的一般模板”编写LED驱动

使用“新字符设备的一般模板”编写LED驱动&#xff0c;使用寄存器直接开关灯。 1、创建LED目录 输入“cd /home/zgq/linux/Linux_Drivers/回车” 切换到“/home/zgq/linux/Linux_Drivers/” 输入“ls回车”&#xff0c;查看“/home/zgq/linux/Linux_Drivers/” 输入“mkdi…

IDEA自带 .http 请求工具文档

基础语法 请求格式 基础格式 Method Request-URI HTTP-Version Header-field: Header-valueRequest-Body其中&#xff0c;GET 请求可以省略 Method 不写&#xff1b;HTTP-Version 可以省略不写&#xff0c;默认使用 1.1 版本。 示例&#xff1a; GET https://www.baidu.co…

【LaTeX】行内代码块、行间代码块的插入以及高亮(懒人版)

文章目录 思路和优点基本框架行内代码行间代码pythoncpp 所支持的语言所支持的代码风格 思路和优点 思路是listingsminted包&#xff0c; 一个负责插入代码一个负责高亮代码 这种方法显著的优点在于&#xff1a;完全不需要自定义代码风格 使用其他方法时&#xff0c;你定义好…

组合逻辑电路(二)(译码器和编码器)

目录 译码器 简单逻辑门译码器 二进制译码器 2线-4线译码器 3线-8线译码器 二-十进制译码器 4线-10线译码器 七段显示译码器 编码器 二进制普通编码器 二-十进制普通编码器&#xff08;8421BCD码编码器&#xff09; 优先编码器&#xff08;Priority Encoder&#xff09; 译…

httprunner参数化

1. 示例 引入对应的Parameters 1.1. CSV参数 from httprunner import HttpRunner, Config, Step, RunRequest, Parameters pytest.mark.parametrize("param", Parameters({"mobile_phone-pwd": "${P(csv_data/mobile_phone-pwd.csv)}"}))def …