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

一、LeetCode 491.递增子序列

题目链接/文章讲解/视频讲解:https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F%E5%88%97.html

状态:已解决

1.思路 

        这道题看似和90题差不多,都是求子集并且有重复元素,但实则大有不同。因为这道题要求给出非递减子序列,因此我们不能用排序的方式来去重。那该怎么办呢?其实40题的去重逻辑的核心就是要我们在同层递归(树层)的时候,不再选取已经出现过的值

        在40题中,我们用nums[i]==nums[i-1]和used[i-1]==0两个共同的条件来判定此时是树层重复还是树枝重复。那失去了nums[i]有序的这个条件又如何判定了?其实很简单,因为我们只需要控制同一树层的时候,不选取已经选取过的值,也就是说,只要我们在树层开始前设个数组,让这个数组存放已经出现过的值,那么如果这次for循环选取的值数组中已经有了,就说明该值已经出现过,我们跳过不做后续操作就好。(做完了发现可行并且老师也是这个做法!!)

2.代码实现

       每层递归用来存放for循环已经选取过的值的数组可以采用set实现,也可以用map实现。我这里用的map,老师讲解用的set。        

class Solution {
public:vector<int> path;vector<vector<int>> result;void backtracking(vector<int>& nums,int startIndex){if(path.size()>1)//注意集合中至少两个元素result.push_back(path);if(startIndex>=nums.size()){return ;}unordered_map<int,int> used;for(int i=startIndex;i<nums.size();i++){if(i>startIndex && used.find(nums[i])!= used.end() && used[nums[i]]==1){continue;}//判断是否已经出现过该值,used.find(nums[i])!= used.end()很重要if(path.size()==0 || nums[i]>=path[path.size()-1]){path.push_back(nums[i]);used[nums[i]]=1;backtracking(nums,i+1);path.pop_back();}}}vector<vector<int>> findSubsequences(vector<int>& nums) {path.clear();result.clear();backtracking(nums,0);return result;}
};

二、46.全排列

题目链接/文章讲解/视频讲解:https://programmercarl.com/0046.%E5%85%A8%E6%8E%92%E5%88%97.html

状态:已解决

1.思路 

        排列与组合的区别在于排列要看集合元素之间的顺序,而组合不看,也就是说,对排列来说,{1,2}和{2,1}是两个集合,而对组合而言,二者是同一个集合。我们在做组合题时曾经说过,为了避免组合时出现相同组合{1,2}、{2,1},令startIndex根据上层i的取值来取,使得startIndex>i,因此,要使组合变排列,只需将startIndex的取值范围变一下,变为从0开始取值,确保原数组后面的元素也可以作为集合中靠前的元素。不过,为了确保前后取到同一个元素值,我们需要记录下来每层递归所取的值,让后续递归不再取它们,也就是要进行树枝去重,用used数组实现。

2.完整代码

class Solution {
public:vector<int> path;vector<vector<int>> result;void backtracking(vector<int>& nums,vector<int>& used){if(path.size() == nums.size()){result.push_back(path);return ;}for(int i=0;i<nums.size();i++){if(used[i]==1) continue;path.push_back(nums[i]);used[i] = 1;backtracking(nums,used);used[i] = 0;path.pop_back();}}vector<vector<int>> permute(vector<int>& nums) {vector<int> used(nums.size(),0);backtracking(nums,used);return result;}
};

三、47.全排列 II

题目链接/文章讲解/视频讲解:https://programmercarl.com/0047.%E5%85%A8%E6%8E%92%E5%88%97II.html

状态:已解决

1.思路 

        因为有重复元素,又是排列题,故此题实则就是40题双重去重和46题的一个结合。需要在46题一个树枝去重和一个树层去重的操作,具体怎么操作可以去看40题的解法。注意,对于used操作的用法,在组合和排序中,used数组含义是相同的,但是组合主要是用来佐证确定树层去重,而排序是用来确保树枝去重的。

2.代码实现

class Solution {
public:vector<int> path;vector<vector<int>> result;void backtracking(vector<int>& nums,vector<int>& used){if(path.size() == nums.size()){result.push_back(path);return ;}for(int i=0;i<nums.size();i++){if(i>0 && nums[i]==nums[i-1] && used[i-1]==0) continue;if(used[i]==1) continue;path.push_back(nums[i]);used[i]=1;backtracking(nums,used);used[i]=0;path.pop_back();}}vector<vector<int>> permuteUnique(vector<int>& nums) {sort(nums.begin(),nums.end());vector<int> used(nums.size(),0);backtracking(nums,used);return result;}
};

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

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

相关文章

力扣24. 两两交换链表中的节点

Problem: 24. 两两交换链表中的节点 文章目录 题目描述思路复杂度Code 题目描述 思路 1.创建虚拟头节点dummy和尾指针tial指向dummy&#xff1b;创建指针p指向head 2.当head不为空同时head -> next 不为空时&#xff1a; 2.1.创建指针nextP指向p -> next -> next; 2.2…

0203逆矩阵-矩阵及其运算-线性代数

文章目录 一、逆矩阵的定义、性质和求法二、逆矩阵的初步应用结语 一、逆矩阵的定义、性质和求法 定义7 对于 n n n阶矩阵A&#xff0c;如果有一个 n n n阶矩阵B&#xff0c;使 A B B A E ABBAE ABBAE 则说矩阵A是可逆的&#xff0c;并把矩阵B称为A的逆矩阵&#xff0c;简称逆…

[xboard]real6410-3 官方镜像烧录与功能测试

文章目录 1 real6410官方资源1 官方镜像2 官方源码3 官方测试2 ok6410a资源3 友善6410资源4 uboot学习参考 1 real6410官方资源 1 官方镜像 2 官方源码 3 官方测试 2 ok6410a资源 3 友善6410资源 4 uboot学习 参考

Redis Stack十部曲之二:理解Redis Stack中的数据类型

文章目录 前言String字符串作为计数器限制 List限制列表阻塞列表自动创建和删除聚合类型键限制 Set限制 Hash限制 Sorted Set范围操作字典操作更新分数 JSON路径限制 BitMapBitfieldProbabilisticHyperLogLogBloom filterCuckoo filtert-digestTop-KCount-min sketchConfigurat…

抽象类为什么有抽象方法?

以一个简单的图形绘制程序为例&#xff0c;其中我们将创建一个抽象类Shape&#xff0c;它定义了所有形状共有的行为和属性&#xff0c;同时允许具体的子类提供自己的实现。 首先&#xff0c;我们定义一个抽象类Shape&#xff1a; java public abstract class Shape { // 形状的…

mongodb 基础查询使用

环境安装 https://blog.csdn.net/qq_42402648/article/details/134932412 net start MongoDB 启动 net stop MongoDB 停止测试插入数据结构 {"create_time": {"$data": "1711244538176"},"language": "en","create_ti…

AI绘画:Stable Diffusion的高效操作界面,ComfyUI:安装和使用篇

前言 Stable Diffusion&#xff08;简称SD&#xff09;是一款强大的AI绘画工具&#xff0c;通常通过Web UI操作界面进行使用。然而&#xff0c;对于那些寻求更高效率和个性化工作流的用户来说&#xff0c;ComfyUI提供了一个基于节点流程的操作界面&#xff0c;使得工作流定制更…

文献分享:《Clinical metagenomics》

摘要|临床宏基因组下一代测序&#xff08;mNGS&#xff09;是对患者样本中微生物和宿主遗传物质&#xff08;DNA和RNA&#xff09;的综合分析&#xff0c;目前正迅速从研究向临床实验室发展。这种新兴的方法正在改变医生诊断和治疗传染病的方式&#xff0c;其应用涉及广泛的领域…

Java快速入门系列-1(Java概述)

第一章&#xff1a;Java概述 1.1 Java的发展历程1.2 Java的特点与优势1.2.1 特点1.2.2 优势 1.3 Java生态系统介绍1.4 Java在当前技术领域的应用案例 1.1 Java的发展历程 Java语言由Sun Microsystems公司于1995年推出&#xff0c;由James Gosling领导的Green Team小组研发而成…

【深度学习】入门深度学习相关

1.知识点&&小问题 参考视频&#xff1a;最详细的 Windows 下 PyTorch 入门深度学习环境安装与配置 CPU GPU 版 | 土堆教程 1.Pytorch和TensorFlow都是python的包/库。 2.为什么使用Anaconda&#xff1f;Anaconda的优势是有虚拟环境。 3.计算机底层对于Python语言&…

git branch 是干什么的

git branch 是 Git 版本控制系统中的一个命令&#xff0c;用于列出、创建、删除和重命名仓库中的分支。分支在 Git 中是一个非常重要的概念&#xff0c;它允许开发者在主线&#xff08;通常是 master 或 main 分支&#xff09;之外创建新的开发线&#xff0c;以在不干扰主线的情…

关于C#操作SQLite数据库的一些函数封装

主要功能&#xff1a;增删改查、自定义SQL执行、批量执行&#xff08;事务&#xff09;、防SQL注入、异常处理 1.NuGet中安装System.Data.SQLite 2.SQLiteHelper的封装&#xff1a; using System; using System.Collections.Generic; using System.Data.SQLite; using System.…

WebGL BabylonJs 如何切换相机

根据不同场景&#xff0c;可能会有多个相机切换的需求 &#xff0c;通过scene.activeCamera即可实现。 例如&#xff1a; // 1、创建多个相机const freeCamera new BABYLON.FreeCamera(FreeCamera,new BABYLON.Vector3(-50, -8, -16),scene,)const arcRotateCamera new BAB…

深入理解JavaScript - 箭头函数中的this永远指向全局对象?

箭头函数中的this永远指向全局对象&#xff1f; 不是&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 箭头函数并没有自己的this值&#xff0c;它捕获定义时所在上下文的this值作为自己的this值。 也就是说&#xff0c;箭头函数中的 this是在定义…

天眼护航 安全无界:天通哨兵PS02—电力巡检保护的智能利器

在电力行业中&#xff0c;输电线路的安全稳定运行对于保障社会经济活动至关重要。然而&#xff0c;广阔的输电线路常常穿越复杂的地形和恶劣的自然环境&#xff0c;给电力巡检和保护工作带来了巨大挑战。 为了提高巡检效率和响应速度&#xff0c;更好地保障电力设施的安全运行…

Opencv人机交互界面设置

Opencv人机交互界面设置 以下是一些常见的OpenCV人机交互界面设置&#xff1a; 窗口交互 显示窗口&#xff1a;可以使用cv2.imshow()函数在屏幕上显示图像。例如&#xff0c;要显示名为“image”的图像&#xff0c;可以使用以下代码&#xff1a; import cv2img cv2.imread…

前端三剑客 —— CSS (第三节)

目录 上节回顾&#xff1a; 1.CSS使用有以下几种样式; 2.选择器 1.基本选择器 2.包含选择器 3.属性选择器 [] 4.伪类选择器 &#xff1a; 5.伪元素选择器 ::before :after 3.常见样式的使用 常见样式参考表 一些特殊样式 媒体查询 自定义字体 变换效果 translate&…

深入PostgreSQL中的pg_global表空间

pg_global表空间的位置 在PG当中&#xff0c;一个实例(cluster)初始化完以后&#xff0c;你会看到有下边两个与表空间相关的目录生成&#xff1a; $PGDATA/base $PGDATA/global 我们再用元命令\db以及相关视图看看相应的表空间信息&#xff1a; postgres# \db …

雨云服务器:当清风遇上明月,服务器的美好新时代

引言&#xff1a;为什么说服务器是网站的“心脏”&#xff1f; 在数字时代&#xff0c;网站已经成为企业和个人展示自己的重要平台。然而&#xff0c;想要网站运行得稳定、快速&#xff0c;除了好的内容外&#xff0c;一个稳定、高效的服务器也是至关重要的。就像人体需要有一…

【解决】Unity Profile | FindMainCamera

开发平台&#xff1a;Unity 2020.3.7f1c1 关键词&#xff1a;FindMainCamera   问题背景 ModelViewer 是开发者基于 UnityEngine 编写的相机控制组件。ModelView.Update 中调度52次并触发3次GC.Collect。显然并不期望并尽可能避免 Update 造成的GC 问题。事实上 FindMainCame…