代码随想录训练营第25天 || 491. 非递减子序列 46. 全排列 47. 全排列 II

代码随想录算法训练营Day25 | 491. 非递减子序列、46.全排列、47.全排列 II、332.重新安排行程、51.N皇后、37.解数独、总结 阅读详情

491. 非递减子序列:

讲解:代码随想录

思路:

递归:抽象为一颗树,不能使用标记数组进行去重,因为不能排序,所以使用一个集合来去重,如果使用过就放入集合,每当取数时,如果在集合中找到,就跳过当前数,来去重,注意集合是每遍历层就会重置,这一步很巧妙,避免同层重复。

代码:

class Solution {
    vector<vector<int>> result;
    vector<int> path;
private:
    void caozuo(vector<int>& nums,int startindex)
    {
        if(path.size()>=2)
        {
            result.push_back(path);
        }
        unordered_set<int> uset;巧妙,在此重置每当进入下一层时都会重置set
        for(int i =startindex ;i<nums.size();i++)
        {
            if((!path.empty() && nums[i] < path.back())|| uset.find(nums[i])!= uset.end())//back()表示末尾元素 ,find()函数会查找括号内的值,如果找到会返回下标的迭代器,如果没找到会返回end()的迭代器
            {
                continue;
            }
            uset.insert(nums[i]);
            path.push_back(nums[i]);
            caozuo(nums,i+1);
            path.pop_back();
        }
    }
public:
    vector<vector<int>> findSubsequences(vector<int>& nums) {
      result.clear();
      path.clear();
      caozuo(nums,0);
      return result;  
    }
};

遇到的问题:

1.对于集合初始化的位置选择,每当进入下一层时都会重置set

2.cpp的find()函数,会查找指定容器内某个范围的指定数值的迭代器,如果没有查找到会返回容器末尾的迭代器。find(要查找范围的开头,要查找范围的末尾,查找的数值)

46. 全排列:

讲解:代码随想录

思路:

递归:因为集合内每个元素只能使用一次,所以需要进行树枝去重,没有重复元素所以不需要进行树层去重

代码:

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

遇到的问题:

1.对于树枝去重和树层去重的理解

47. 全排列 II:

讲解:代码随想录

思路:

递归:相比于上一题,因为原数组有了重复的数,但是结果又不能有重复的,所以不光需要树枝去重,还需要树层去重

代码:

class Solution {
private:
    vector<vector<int>> result;
    vector<int> path;
    void caozuo(vector<int>& nums,vector<bool>& 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]==false)
            {
                continue;
            }
            if(used[i]==false)
            {
                used[i] = true;
                path.push_back(nums[i]);
                caozuo(nums,used);
                path.pop_back();
                used[i] = false;
            }
        }
    }
public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        result.clear();
        path.clear();
        sort(nums.begin(), nums.end()); // 排序
        vector<bool> used(nums.size(), false);
        caozuo(nums, used);
        return result;
    }
};

遇到的问题:

1.对于树枝去重的不同形式:因为此题同时进行了树枝去重和树层去重,所以此处树枝去重这样写的if(used[i]==false)
            {
                used[i] = true;
                path.push_back(nums[i]);
                caozuo(nums,used);
                path.pop_back();
                used[i] = false;
            }

2..只要是树层去重,使用标记数组,就要进行排序:原因是如果不排序,重复的元素不会相邻,这样就没法通过查找标记数组来确定,是树层的遍历,还是树枝的遍历

电流镜结构实战:从零理解MOS管偏置电路设计(附吴金课程补充) 本文深入解析电流镜结构在MOS管偏置电路设计中的关键作用,从基本原理到实战应用全面覆盖。通过分析偏置电路的核心原理、破解设计难题的实用技巧,以及进阶优化策略,帮助工程师掌握这一模拟电路设计的核心技术。特别适合需要理解电流镜结构和基准电路设计的读者参考学习。 阅读详情

相关推荐

关于VS2022创建winform窗体后择项或选择工具箱项加载visionPro控件卡住,窗口未响应解决方法

解决winform加载工具箱选择项卡死问题

xiaokiss_的博客 3210

代码随想录算法训练营day25

今天是算法营的第25天,希望自己能够坚持下来!今日任务:● 491. 非递减子序列● 46. 全排列● 47. 全排列 II● 332. 重新安排行程1.需要用used数组去重的时候,要看清楚题目有没有顺序要求,有要求的情况下不能用used数组,只能用set。2.在数据范围不大的情况下,可以用数组来代替set,效率会更高。2.排列问题不需要sertIndex,但是需要用used来进行树枝去重。后面三道题,做了一道已经汗流浃背了,之后二刷再做吧。明天继续加油!

qq_38365428的博客 757

绿盾注册机 使用手册

在很多涉及工程设计的单位(如建筑、模具、电路、广告等),电子图纸的应用极为普遍,而电子图纸的丢失、被盗对企业利益的影响是显而易见的,如果被竞争对手获取,甚至可能造成致命的打击。因此,对于这类企业,电子图纸的保密显得至关重要。绿盾信息安全管理软件充分考虑了电子图纸的各种可能传播途径,制定了针对性的解决方案,从而保证了电子图纸的安全。 我们总结了电子图纸的各种传播途径以及相应的对策,有如下几点:

997

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

这道题目是子集问题,需要startIndex去重,然后给定数组中也有重复元素,所以还需要used数组去重。

Tong_1024_的博客 1085

Multisim仿真入门:单相半波可控整流电路从搭建到波形分析(附避坑指南)

本文为电力电子技术初学者提供了一份详细的Multisim仿真指南,手把手教你从零搭建单相半波可控整流电路。通过对比纯电阻、阻感负载及加入续流二极管后的波形变化,直观理解晶闸管触发、电感续流等核心原理,并附有实用的参数设置与常见问题避坑指南,帮助你将抽象理论转化为可视化的工程实践。

weixin_29208077的博客 343

结构光三维重建(一)条纹结构光三维重建

在近景三维重建领域,结构光技术可以说是应用最广泛的,尤其在工业领域。该技术目前具有高精度和无视弱纹理等优点,但复杂的室外环境还是会对该技术造成一定程度的干扰。目前用的比较多的结构光分别两大类:线结构光以及条纹结构光。接下来我先来简单介绍一下条纹结构光三维重建,事实上,条纹结构光的原理与双目立体匹配是非常相似的。...

AAAA202012的博客 1万+

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

代码随想录算法训练营第29天 回溯算法Part05

Aaron_Yang 1120

ISP工程师实战笔记:5种Demosaic算法优缺点对比(含Hamilton/DFPD代码片段)

本文从ISP工程师实战角度,深入对比了五种经典Demosaic算法的优缺点。文章详细剖析了双线性插值、Hamilton、DFPD、DLMMSE和GBTF等算法的核心思想、实现差异与性能表现,并提供了Hamilton和DFPD算法的关键代码片段。重点探讨了在图像信号处理流水线中,如何根据画质、计算复杂度和功耗等工程约束进行算法选型与权衡。

weixin_42527589的博客 248

代码随想录算法训练营day29 || 491.非递减子序列,46.全排列,47. 全排列||

思路:要求结果不重复,数组内存在重复元素,但是不强调元素顺序不可变,所以使用visited数组结合数组排序解题。思路:组合问题,存在重复元素,强调nums内元素顺序。采用startindex以及set局部已用元素去重;

旭 1060

HDMI接口及其在编程中的应用

在编程中,我们可以使用HDMI接口来控制和管理连接到计算机的HDMI设备。本文将介绍HDMI接口的基本原理以及如何在编程中使用HDMI接口。在编程中,我们可以使用HDMI接口来控制和管理连接到计算机的HDMI设备。本文介绍了HDMI接口的基本原理,并提供了使用Python编程语言和相关库实现HDMI接口应用的示例代码。我们可以使用编程语言提供的音频库来生成和播放音频,并将其通过HDMI接口输出到连接的设备上。我们可以使用编程语言提供的音频库来生成和播放音频,并将其通过HDMI接口输出到连接的设备上。

CodeByte的博客 802

2026保姆级:1小时搞定C# OPC UA客户端开发——PLC与上位机全量数据交互零基础教程

本文介绍了使用C#开发OPC UA客户端的核心流程和关键代码实现。文章首先指出工业上位机开发中OPC UA的重要性,并针对新手常见问题提出了1小时掌握核心功能的解决方案。重点内容包括:选择官方.NET Standard库的优势、5分钟搭建开发环境的步骤、OPC UA客户端架构与通信流程的图解说明,以及完整的客户端基础类代码实现,涵盖了连接管理、证书配置、安全认证等关键功能。通过本文提供的代码模板,开发者可快速实现与PLC等工业设备的稳定数据交互。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 799

代码随想录算法训练营第29天 | 491.非递减子序列, 46.全排列, 47.全排列II

(2)第二道题的去重思路是:因为数组是有序的,所以我们只需要判断如果遇到了连续好几个一样的元素,我们used是用来区别不同的情况:一种是数枝遍历,可以使用数组内相同的元素,一种是树层遍历,不可以使用相同的元素。(1)第一道题的去重思路是对同一根节点的树层去重,也就是在遇到一个树层时,我们就创建一个新的used数组,如果后面的元素与之前的元素重了我们就直接跳过。因为是无序的所以我们就只能没遇到一个树层就进行创建used数组。但这里并不只是丹丹的去重,和之前组合的去重不一样的是组合去重并不是从0开始遍历的。

2301_76612880的博客 809

2024阅读AOSP源码的正确打开姿势

在Android系统开发中,阅读AOSP(Android Open Source Project)源码是非常重要的环节。然而,如何构建一个优雅的阅读环境却是一个不容忽视的问题。本文将介绍不同工具和方法下阅读AOSP源码的正确姿势,并对比其优缺点。

虎哥LoveDroid 2707

【代码随想录训练营第42期 Day25打卡 回溯Part4 - LeetCode 491.非递减子序列 46.全排列 47.全排列 II

回溯解决子序列,排列问题

记得要努力变强 1151

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

代码随想录-算法训练营day29(回溯算法05:非递减子序列,全排列,全排列2)

/如果是在树枝上,因为已经进入了新的回溯函数,所以nums已经重置了,used[nums[i] + 100] == 0,就可以加进去。//元素个数确定,数组也行,不对不行,要用path.size==nums.length去判断结束,只能用List。//元素个数确定,数组也行,不对不行,要用path.size==nums.length去判断结束,只能用List。//本体题不能排序,用哈希法的数组表现形式去重。//used[nums[i] + 100] == 1 说明本树层上已经用过了,就不能用了;

weixin_61931006的博客 944

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

代码随想录算法训练营Day30 | 491.非递减子序列、46.全排列、47.全排列Ⅱ

训练营第30天:491.非递减子序列、46.全排列、47.全排列Ⅱ

jiabao0520的博客 748

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

代码随想录算法训练营第二十五天| 491.递增子序列 46.全排列 47.全排列 II 51.N皇后

回溯算法最后一篇,一定要注意设计回溯递归时的还原现场、以及递归函数本身的传参、终止条件要素。在含有重复答案时需要考虑去重,常用方法有同树层去重以及哈希集合的方式。进阶题目二刷时再来练手。文章图片来源:代码随想录 (https://programmercarl.com/)

Mwicogito的博客 847

算法训练营day25--491.非递减子序列+46.全排列+47.全排列 II

491.非递减子序列+46.全排列+47.全排列 II

qq_42029265的博客 1247

代码随想录算法训练营第二十五天 | 491.递增子序列、46.全排列、47.全排列 II、51.N皇后、37.解数独

代码随想录算法训练营第二十五天 | 491.递增子序列、46.全排列、47.全排列 II、51.N皇后、37.解数独

2301_81109252的博客 811

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

第一题是去重的不同,去重时注意所给数据是否有序,有序的话就可以使用 Leetcode. 90 的去重思想;无序的话就需要其他容器记录已使用元素。排列问题要求结果有序,所以每次遍历都需要从头开始,并且需要一个容器记录哪些元素被使用过,注意这里的标识不是为了去重,而是为了调整结果顺序。去重和判断元素使用情况的区别,从Leetcode. 47 就可以看出来了。

weixin_43831376的博客 941

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

给你一个整数数组nums,找出并返回所有该数组中不同的递增子序列,递增子序列中。你可以按返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。[[4,4]]

1131

代码随想录算法训练营第25天 | 491.递增子序列、46.全排列、47.全排列 II、332.重新安排行程、51.N皇后、37.解数独

这题和第 23 天做的「40.组合总和II」虽然都使用的 used 数组进行去重,但不同之处在于本题是对同一个索引位置的元素进行去重,「40.组合总和II」是排好序后对当前元素和前一个元素相同时才去重。本题就不一样了,本题中棋盘的每一个位置都要放一个数字(而 N 皇后是一行只放一个皇后),并检查数字是否合法,解数独的树形结构要比 N 皇后更宽更深。在图中可以看出,同一父节点下的同层上使用过的元素就不能再使用了。从图中,可以看出,二维矩阵中矩阵的高就是这棵树的高度,矩阵的宽就是树形结构中每一个节点的宽度。

程序员黄雷的博客 963

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

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

qq_51395785的博客 1182

代码随想录算法训练营第21天 -- 回溯4 || 491.非递减子序列 / 46.全排列 /47.全排列 II

进行去重,并且我们让其在 for 循环外面,保证每次递归都重新定义一个哈希 set,这样回溯我们就不用对 set 进行 pop 操作了。本题其实,树枝去重和树层去重都可以,下面以 [1, 1, 1] 为例,画出树层去重和树枝去重的两个树状图。数组,因为本题的序列不是单调的,相同的数可能不挨在一起,但我们依然要做树层去重,这里我们使用哈希。除此之外,本题还需要先对数组进行排序,然后再进行上一题和去重的操作。但是,一般树枝去重的效率不如树层去重,我们会优先选择树层去重。所以,在去重操作的代码中,

2402_83930684的博客 713

代码随想录算法训练营第二十九天(回溯5)|491. 非递减子序列、46. 全排列、47. 全排列 II(JAVA)

给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。示例 1:示例 2:提示:跟之前的子集II很像,但是不能用它的去重逻辑,本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了。 46. 全排列 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。示例 1:示例 2:示例 3:提示:

m0_61634066的博客 979

代码随想录算法训练营第二十二天(补)

练习了排列回溯,n皇后和解数独的回溯解法,以及树状数组和离散化数组.

岁岁安的博客 1267
上一篇: 代码随想录训练营第24天 || 93. 复原 IP 地址 78. 子集
下一篇: 代码随想录训练营第27天 || 455. 分发饼干 376. 摆动序列 53. 最大子数组和
dkingf
博客等级 码龄2年 127粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值