代码随想录算法训练营第25天|LeetCode 491.递增子序列、46.全排列、47.全排列 II

1.LeetCode 491.递增子序列

题目链接:https://leetcode.cn/problems/non-decreasing-subsequences/description/
文章链接:https://programmercarl.com/0491.递增子序列.html
视频链接:https://www.bilibili.com/video/BV1EG4y1h78v/

在这里插入图片描述

思路:
本题的难点有如下:
1.终止条件;
2.如何去重;
3.如何判断递增。
1.终止条件:当获取到符合的列表后,需添加到结果集中,但不需要返回,因为还需要继续添加元素。
2.如何去重:
本题数组nums不能调整顺序,而且内部有重复元素,因此不能对其进行排序。故可以使用map对单层的元素使用情况进行标记,当出现重复元素时,只需要判断是否使用即可。
3.如何判断递增:将当前的节点与list中最后的元素进行比较(也就是上一层添入的元素),若大于则添入list中,否则,跳过当前节点继续判断。

解法:
class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> list = new ArrayList<>();public List<List<Integer>> findSubsequences(int[] nums) {if (nums == null || nums.length == 0) {return res;}find(nums,0);return res;}public void find(int[] nums,int startIndex){if (list.size() >= 2) {res.add(new ArrayList(list));}// 检查单层中元素是否被使用Map<Integer,Boolean> used = new HashMap<>();for (int i = startIndex;i<nums.length;i++) {// 去重if (used.get(nums[i]) == null) {used.put(nums[i],true);} else if (used.get(nums[i]) == true) {continue;}// 处理当前节点// 递增if (list.size() == 0 || nums[i] >= list.get(list.size()-1)) {list.add(nums[i]);// 递归find(nums,i+1);// 撤销处理当前节点list.removeLast();} }}
}

2. LeetCode 46.全排列

题目链接:https://leetcode.cn/problems/permutations/description/
文章链接:https://programmercarl.com/0046.全排列.html
视频链接:https://www.bilibili.com/video/BV19v4y1S79W/

在这里插入图片描述

思路:
排列问题的不同:
1.每层都是从0开始搜索而不是startIndex
2.防止path列表中元素重复使用:需要used数组记录path里都放了哪些元素了,也可以使用list的contains方法。

解法:
class Solution {// List<List<Integer>> res = new ArrayList<>();// List<Integer> list = new ArrayList<>();// public List<List<Integer>> permute(int[] nums) {//     if(nums==null || nums.length==0){//         return res;//     }//     find(nums);//     return res;// }// public void find(int[] nums) {//     // 终止条件//     if (list.size()==nums.length) {//         res.add(new ArrayList(list));//         return;//     }//     for(int i = 0; i<nums.length; i++) {//         //处理当前节点//         //判断当前节点是否在之前层添加过 去重//         if(list.contains(nums[i])) {//             continue;//         }//         list.add(nums[i]);//         //递归//         find(nums);//         //撤销当前节点//         list.removeLast();//     }// }List<List<Integer>> res = new ArrayList<>();List<Integer> list = new ArrayList<>();boolean[] used = null;public List<List<Integer>> permute(int[] nums) {if(nums==null || nums.length==0){return res;}used = new boolean[nums.length];find(nums);return res;}public void find(int[] nums) {// 终止条件if (list.size()==nums.length) {res.add(new ArrayList(list));return;}for(int i = 0; i<nums.length; i++) {//处理当前节点//判断当前节点是否在之前层添加过 去重if(used[i] == true) continue;used[i] = true;list.add(nums[i]);//递归find(nums);//撤销当前节点used[i] = false;list.removeLast();}}
}

3. LeetCode 47.全排列 II

题目链接:https://leetcode.cn/problems/permutations-ii/description/
文章链接:https://programmercarl.com/0047.全排列II.html
视频链接:https://www.bilibili.com/video/BV1R84y1i7Tm/

在这里插入图片描述

思路:
题目值给定了一个包含重复数字的序列,因此需要去重。
1️⃣首先排序;
2️⃣单层出现重复元素,除了要判断i-1位置是否与i位置值相同外,还要判断第i-1位置是否被其他层使用过,若使用过,则当前层中i-1位置的值不参与去重判断,否则,参与去重判断。
注意:单层中只能给nums中一个位置的元素赋值ture,表示使用过;若出现第二个,说明是其他层使用过。

解法:
class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> path = new ArrayList<>();boolean[] used = null;public List<List<Integer>> permuteUnique(int[] nums) {if (nums == null || nums.length == 0) {return res;}Arrays.sort(nums);used = new boolean[nums.length];find(nums);return res;}public void find(int[] nums) {if (path.size() == nums.length) {res.add(new ArrayList(path));return;} for (int i=0;i<nums.length;i++) {if (used[i] == true) {continue;}// 去重 
// 若used[i-1]=true,说明i-1位置的值已经被上面的层用过了,则当前层对i-1位置的判断就没有意义了,不应该将i-1位置参与当前层的分析,也就是说,即便nums[i] == nums[i-1],仍然不需要continue;若used[i-1]=false,则当前层对i-1位置的判断就有意义了,应该将i-1位置参与当前层的分析,也就是说,nums[i] == nums[i-1],需要continue。if (i>0 && nums[i] == nums[i-1] && used[i-1] == false) {continue;}// 处理当前节点used[i] = true;path.add(nums[i]);// 递归find(nums);// 撤销当前节点used[i] = false;path.removeLast();}}
}

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

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

相关文章

C# 获取屏幕分辨率缩放比例的详细解释与示例

在C#中&#xff0c;获取屏幕分辨率缩放比例通常指的是Dpi缩放比例&#xff0c;它表示显示设备的独立像素与设备无关像素&#xff08;96 DPI&#xff09;的比例。这通常用于确保应用程序在不同分辨率和缩放设置的显示设备上都能正确显示。.NET Framework 提供了一个名为System.W…

用解释程序交错执行2个线程

多线程问题&#xff0c;对初学者来说&#xff0c;会常常感到神秘。特别想知道它里面到底是怎么执行的&#xff1b;遇到问题时&#xff0c;又会觉得十分迷惑。 前面的例子&#xff0c;swap 语句串扰执行问题&#xff0c;实现了一个assign指令的解释器。现在就借用它的代码&…

Paho Asynchronous MQTT C Client Library--MQTTAsync API

异步MQTT 客户端库for C 基于C语言编写的MQTTAsync API&#xff0c;版权属于IBM&#xff0c;适用于2009年至2018年。 Paho MQTT C库中的API分为两类&#xff1a; 同步API&#xff08;MQTTClient API&#xff09; 特点&#xff1a;被认为是更易于使用&#xff0c;部分函数调用…

TypeScript 中的 interface

在 TypeScript 中&#xff0c;interface 是一种定义对象结构或“形状”&#xff08;shape&#xff09;的类型。它可以指定一个对象必须具有的属性、方法以及它们的数据类型。通过使用 interface&#xff0c;你可以确保对象实例遵循特定的模式或契约。 以下是 interface 的一些…

昇思25天学习打卡营第12天|sea_fish

打开第12天&#xff0c;前几天打卡完成了入门的学习&#xff0c;后续有时间对入门的内容&#xff0c;再次整理一下。本次学习的内容为基于MindSpore的GPT2文本摘要。记录学习的过程。记录实验系统中的步骤&#xff0c;对一些内容进行记录和归纳。 数据集加载与处理 数据集加载…

归并排序详解(递归与非递归)

归并排序是建立在归并操作上的一种有效算法。该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序列有序&#xff0c;再使子序列间断有序。若将两个有序表合并成一个有序表&#xff0c;成为二路归并。 一…

【6】图像分类部署

【6】图像分类部署 文章目录 前言一、将pytorch模型转为ONNX二、本地终端部署2.1. ONNX Runtime部署2.2. pytorch模型部署&#xff08;补充&#xff09; 三、使用flask的web网页部署四、微信小程序部署五、使用pyqt界面化部署总结 前言 包括将训练好的模型部署在本地终端、web…

【Android】自定义换肤框架01之皮肤包制作

前言 目前为止&#xff0c;市面上主流的安卓换肤方案&#xff0c;其实原理都是差不多的 虽然大多都号称一行代码集成&#xff0c;但其实想要做到完全适配&#xff0c;并不简单 这个系列&#xff0c;就是让大家从零开始&#xff0c;完全掌握这方面知识&#xff0c;这样才能对…

关于vue监听数组

Vue.js 监听数组&#xff1a;深入理解与实践 在 Vue.js 开发中&#xff0c;数据的响应式更新是其核心特性之一。当我们处理数组时&#xff0c;如何高效地监听数组的变化&#xff0c;及时更新视图&#xff0c;是每个开发者都需要掌握的技能。本文将深入探讨 Vue.js 监听数组的机…

RabbitMq - Java客户端基础【简单案例 +Work模型】

目录 1、前置知识 1.1、AMQP怎么理解 1.2、Spring AMQP是什么 1.3、为什么要了解Spring-AMQP&#xff1f; 2、使用Spring-AMQP实现一个发消息案例 3、Work模型 问题&#xff1a; 优化&#xff1a; 小结&#xff1a;Work模型的使用&#xff1a; 1、前置知识 1.1、AMQP怎…

Automatic TSPITR in 10G RMAN 19C DBV expdp “TEST” RAC中 thread

TSPITR 注意事项&#xff1a; 19C DBV expdp 不用exp imp “TEST” 一定要“” 起来&#xff0c;否则说找不到test tablespace. RAC中 thread 要指定对&#xff0c;否则过度恢复。 SEQUENCE# 是drop 时的&#xff0c;不是创建时的。 tablespace 默认是offline的&#xf…

【WPF】桌面程序开发之xaml页面基础布局方式详解

使用Visual Studio开发工具&#xff0c;我们可以编写在Windows系统上运行的桌面应用程序。其中&#xff0c;WPF&#xff08;Windows Presentation Foundation&#xff09;项目是一种常见的选择。然而&#xff0c;对于初学者来说&#xff0c;WPF项目中xaml页面的布局设计可能是一…

EtherCAT转Profinet网关配置说明第三讲:博图配置

EtherCAT协议转Profinet协议网关模块&#xff08;XD-ECPNS20&#xff09;是实现EtherCAT协议和Profinet协议之间无缝通讯的重要设备。使EtherCAT协议和Profinet协议能够相互转换&#xff0c;进行工控自动化里的互连和传送数据。 EtherCAT作为一种高性能实时以太网通信协议&…

11、广告-数据统计原理

数据统计原理 数据统计是程序化广告中非常重要的一环&#xff0c;通过对广告数据和用户行为数据的统计分析&#xff0c;广告主可以评估广告效果、优化投放策略&#xff0c;提升用户转化率和广告收益。以下是关于数据统计原理的详细介绍&#xff1a; 一、Web统计逻辑 浏览器请…

【讲解下iOS语言基础】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

1431. 拥有最多糖果的孩子

1431. 拥有最多糖果的孩子 题目链接&#xff1a;1431. 拥有最多糖果的孩子 代码如下&#xff1a; class Solution { public:vector<bool> kidsWithCandies(vector<int>& candies, int extraCandies) {vector<bool> res(candies.size(),false);int max…

2024中国深圳国际新能源暨清洁能源产业展览会(高交会)

105个国家、5000家参展商、40万㎡展览规模、50万买家客户参观&#xff0c;高交会清洁能源展11月中旬将盛大启幕&#xff1b; ——在科技日新月异、产业融合加速的时代浪潮中&#xff0c;一场备受瞩目的科技盛会即将拉开帷幕&#xff0c;「第二十六届中国国际储能技术与设备展览…

【Linux详解】进程等待 | 非阻塞轮询

引入&#xff1a; 为什么&#xff1f;是什么&#xff1f;怎么办 是什么&#xff1f; 进程等待是指父进程暂停自己的执行&#xff0c;直到某个特定的子进程结束或发生某些特定的事件。 为什么&#xff1f; 僵尸进程刀枪不入&#xff0c;不可被杀死&#xff0c;存在内存泄露…

Linux_实现简易日志系统

目录 1、认识可变参数 2、解析可变参数 3、打印可变参数 3.1 va_list 3.2 va_start 3.3 va_arg 3.4 va_end 3.5 小结 4、实现日志 4.1 日志左半部分 4.2 日志右半部分 4.3 日志的存档归类 结语 前言&#xff1a; 在Linux下实现一个日志系统&#xff0c;该日…

ffmpeg图片视频编辑器工具的安装与使用

title: ffmpeg图片视频编辑器工具的安装与使用 tags: [ffmpeg, 图片, 音频, 视频, 工具, 流媒体] categories: [工具, ffmpeg] FFmpeg是一个开源的命令行工具&#xff0c;广泛用于处理视频和音频文件&#xff0c;包括转换格式、剪辑、混流、解码、编码等。以下是一些基本的FFmp…