代码随想录训练营Day29

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、递增子序列
  • 二、全排列
  • 三、全排列2


前言

今天是跟着代码随想录刷题的第29天,今天主要学了以下几个内容:491.递增子序列、46.全排列、46.全排列
链接地址:递增子序列、全排列、全排列2


一、递增子序列

思路:这道题需要注意的点就是在收取结果的时候要判断数组长度大于2,还有一个就是如何去重,他这里需要用到set,如果这个元素在set里面有相应的元素,就不能放进去,因为是横向去重,所以在也就是说进入新一层递归的话,这个set需要被重置的,这样的话,他就不能做回溯的操作了,只需要在函数的内部定义这个set就可以了,这样进入新一轮递归的话,就刷新了set,还有一个就是需要递增的逻辑的就是,你拿过来的元素一定要比path的最后一个元素小的话,也需要跳过。

class Solution {
public:
    vector<int> path;
    vector<vector<int>> result;
    void backtracking(vector<int>& nums,int start)
    {
        if(path.size()>1) result.push_back(path);
        if(start>=nums.size()) return;
        unordered_set<int> result_set;
        for(int i=start;i<nums.size();i++)
        {
            
            if(i>0)
            {
                if(result_set.find(nums[i])!=result_set.end()) continue;
                if(path.size()>0&&nums[i]<path.back()) continue;
            }
            
            result_set.insert(nums[i]);
            path.push_back(nums[i]);
            backtracking(nums,i+1);
            path.pop_back();

        }
    }
    vector<vector<int>> findSubsequences(vector<int>& nums) {
    result.clear();
    path.clear();
    backtracking(nums,0);
    return result;
    

    }
};

版本2:
这里是用数组来去重,因为数字从-100到100,所以需要两百数组,又因为数组不能负下标,所以所以全部加100,用过了,那里的下标就标成1,检查如果是1,就不能用,如果进入下一层递归,又是一个新数组。就没问题。
这里需要注意一下和之前全局数组的区别,之前是我这一层是变为1,又回来,所以上一个如果是0,就能知道是重复,最重要的是我可以对比这一个和上一个是不是相等,因为如果没有这个值,他也是0,我如何区分有没有这个值呢,因为排序过了,通过对比这个和上个是不是相等,如果相等,又是0,就说明很有问题,但是这道题不能这样,因为我没有排序,如果有一样的元素,我不知道在哪,就算是0,也可能是她本来就没有这个元素,不能代表是同一层

class Solution {
private:
    vector<vector<int>> result;
    vector<int> path;
    void backtracking(vector<int>& nums, int startIndex) {
        if (path.size() > 1) {
            result.push_back(path);
        }
        int used[201] = {0}; // 这里使用数组来进行去重操作,题目说数值范围[-100, 100]
        for (int i = startIndex; i < nums.size(); i++) {
            if ((!path.empty() && nums[i] < path.back())
                    || used[nums[i] + 100] == 1) {
                    continue;
            }
            used[nums[i] + 100] = 1; // 记录这个元素在本层用过了,本层后面不能再用了
            path.push_back(nums[i]);
            backtracking(nums, i + 1);
            path.pop_back();
        }
    }
public:
    vector<vector<int>> findSubsequences(vector<int>& nums) {
        result.clear();
        path.clear();
        backtracking(nums, 0);
        return result;
    }
};

二、全排列

思路:这里没有start,就是需要used去重罢了。

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

    }
};

还有一种用bool下标数组来写的
在这里插入图片描述

三、全排列2

思路:总结一下方法:下标一一对应来标记去重缺点是只可以做那些允许你给原数组排序的题,这样才能把一样的数放到一起,优点是可以做树枝去重(就是没有startindex需要去重自己元素);元素去重限制比较多,只能做简单的树层去重,这道题涉及到了树枝去重做不了了。
这里就用的下标数组来做,注意就是既要进行树枝去重又要进行树层去重。
代码:

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



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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python中实现队列功能

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 python中实现队列功能 选择题 以下代码最后一次输出的结果是&#xff1f; from collections import deque queue deque() queue.append(1) queue.append(2) queue.append(3) print(【显示】…

惊呆了!六西格玛培训竟然这么强大!——张驰咨询

六西格玛&#xff0c;这个在业界久负盛名的管理理念&#xff0c;它的魅力太强大了。曾听闻它能帮助企业和个人提升竞争力&#xff0c;但当真正走进这个培训体系时&#xff0c;会发现它的影响力远超你的想象。 在六西格玛的指导下&#xff0c;企业实现了显著的转变。之前那些看…

微软云计算[1]之云计算平台、云操作系统Windows Azure

微软云计算平台 微软云计算平台微软的云计算技术Windows Azure组成 微软云操作系统Windows AzureWindows Azure概述Windows Azure计算服务Windows Azure存储服务全局命名空间体系架构存储域的层次结构双复制引擎文件流层分区层 Windows Azure ConnectWindows Azure CDNFabric控…

第二证券股市资讯:全球第二!英伟达市值再超苹果

昨夜&#xff0c;英伟达股价再度大涨。‍‍‍ 当地时间6月5日周三&#xff0c;美股三大股指全线收涨。到收盘&#xff0c;道指涨0.25%&#xff0c;纳指涨1.96%&#xff0c;标普500指数涨1.18%。 经济数据方面&#xff0c;美国5月ADP新增工作人数15.2万人&#xff0c;低于预期…

python书上的动物是啥

Python的创始人为Guido van Rossum。1989年圣诞节期间&#xff0c;在阿姆斯特丹&#xff0c;Guido为了打发圣诞节的无趣&#xff0c;决心开发一个新的脚本解释程序&#xff0c;做为ABC语言的一种继承。之所以选中Python作为程序的名字&#xff0c;是因为他是一个叫Monty Python…

【Python报错】AttributeError: ‘NoneType‘ object has no attribute ‘xxx‘

成功解决“AttributeError: ‘NoneType’ object has no attribute ‘xxx’”错误的全面指南 一、引言 在Python编程中&#xff0c;AttributeError是一种常见的异常类型&#xff0c;它通常表示尝试访问对象没有的属性或方法。而当我们看到错误消息“AttributeError: ‘NoneTyp…

基于springboot实现餐饮管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现餐饮管理系统演示 摘要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率…

基于springboot实现民族婚纱预定系统项目【项目源码+论文说明】

基于springboot实现民族婚纱预定系统的设计演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本民族婚纱预定系统就是在这样的大环境下诞生&#xff0c;其可…

3. 使用tcpdump抓取rdma数据包

系列文章 第1章 多机多卡运行nccl-tests 和channel获取第2章 多机多卡nccl-tests 对比分析第3章 使用tcpdump抓取rdma数据包 目录 系列文章一、准备工作1. 源码编译tcpdump2. 安装wireshark 二、Tcpdump抓包三、Wireshark分析 一、准备工作 1. 源码编译tcpdump 使用 tcpdump…

一、【源码】创建简单的映射器代理工厂

源码地址&#xff1a;https://github.com/mybatis/mybatis-3/ 仓库地址&#xff1a;https://gitcode.net/qq_42665745/mybatis/-/tree/01-xxxDao-proxy 创建简单的映射器代理工厂 执行xxxDao.method()时都做了些什么&#xff1f; 原理是&#xff1a;首先定义Dao接口&#xff…

一周学会Django5 Python Web开发 - Django5内置Auth认证系统-用户登录实现

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计57条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

企业购买一套ABAQUS需要多少钱?ABAQUS价格解析

在高性能仿真分析领域&#xff0c;ABAQUS软件凭借其强大的非线性分析能力、精确的求解精度以及广泛的应用范围&#xff0c;成为众多企业和研究机构的首选工具。然而&#xff0c;对于想要采购ABAQUS的企业来说&#xff0c;了解其价格体系是做出投资决策前的关键一步。亿达四方&a…

增值税发票OCR识别功能介绍

OCR增值税发票识别功能介绍如下&#xff1a; 一、技术原理 OCR增值税发票识别系统基于光学字符识别&#xff08;OCR&#xff09;技术和人工智能的支持&#xff0c;将传统纸质发票的信息自动转换为计算机可以读取的数字信息。具体技术流程包括&#xff1a; 图像预处理&#x…

Spring Boot项目中,如何在yml配置文件中读取maven pom.xml文件中的properties标签下的属性值

一、前言 在最近的项目开发过程中&#xff0c;有一个需求&#xff0c;需要在Spring Boot项目的yml配置文件中读取到mave的 pom.xml文件中的properties标签下的属性值&#xff0c;这个要怎么实现呢&#xff1f; 二、技术实践 pom.xml文件中增加测试属性 <properties><…

Vue06-el与data的两种写法

一、el属性 用来指示vue编译器从什么地方开始解析 vue的语法&#xff0c;可以说是一个占位符。 1-1、写法一 1-2、写法二 当不使用el属性的时候&#xff1a; 两种写法都可以。 v.$mount(#root);写法的好处&#xff1a;比较灵活&#xff1a; 二、data的两种写法 2-1、对象式…

基于web的垃圾分类回收系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;公告管理&#xff0c;运输管理&#xff0c;基础数据管理 用户账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;运输管理&#xff0c;公告…

麒麟桌面操作系统KYLINOS 2403安装部署

原文链接&#xff1a;麒麟桌面操作系统KYLINOS 2403安装部署 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于麒麟桌面操作系统2403的安装部署文章。麒麟操作系统是中国自主研发的Linux发行版&#xff0c;以其安全性和稳定性受到广泛关注和使用。本文将详细介绍如…

ChatGPT基本原理详细解说

ChatGPT基本原理详细解说 引言 在人工智能领域&#xff0c;自然语言处理&#xff08;NLP&#xff09;一直是研究的热点之一。随着技术的发展&#xff0c;我们见证了从简单的聊天机器人到复杂的语言模型的演变。其中&#xff0c;ChatGPT作为一项突破性技术&#xff0c;以其强大…

算法与数据结构高手养成:朴素的贪心法(下)二分答案

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

Grafana 还可以这样学,有示例一看就懂

Grafana 是一款流行的开源数据可视化工具&#xff0c;用于监控和分析系统、应用程序和服务的性能和运行状况。它提供了丰富的图表和面板选项&#xff0c;用户可以通过 Grafana 创建各种可视化图表&#xff0c;如折线图、柱状图、饼图等&#xff0c;以便更直观地展示数据。 Gra…