代码随想录训练营Day29

news2024/11/16 13:36:17

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

文章目录

  • 前言
  • 一、递增子序列
  • 二、全排列
  • 三、全排列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;
    
    }
};



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

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

相关文章

1877java项目建设平台管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 项目建设平台管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助采用了java设计&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开 发。开发环境为TOMCAT7.0,Myeclipse8.…

工频耐压试验仪

武汉凯迪正大智能5KV工频耐压仪是根据国家行业试验标准而设计的试验设备&#xff0c;其功能强、使用方便、维护简单。主要用于对各种电器产品、电气元件、绝缘材料等进行规定电压下的碳化试验&#xff0c;绝缘强度试验&#xff0c;以考核产品的绝缘水平&#xff0c;发现被试品的…

将小爱音箱接入 ChatGPT 和豆包ai改造成专属语音助手

这个GitHub项目&#xff0c;mi-gpt&#xff0c;旨在将小爱音箱和米家设备与ChatGPT和豆包集成&#xff0c;有效地将这些设备转变为个性化语音助手。以下是对其功能和设置的详细分析&#xff1a; 主要特点 角色扮演&#xff1a;该项目允许小爱适应不同的角色&#xff0c;如伴侣…

源码编译安装LNMP

目录 LNMP包含&#xff1a; LNMP的工作原理 &#xff1a; 编译安装&#xff1a; nginx服务器配置 安装依赖包 创建用户 上传软件包至/opt目录下并解压 编译安装 设置软链接&#xff0c;可以直接调用nginx命令来进行管理 添加Nginx系统服务 配置Nginx支持php解析&…

关于文件上传失败问题的排查思路

问题场景&#xff1a; 最近公司的app有很多用户反馈上传文件失败了。业务路径就是简单的app前端调用后端文件上传接口&#xff0c;所以发生上传失败的可能因素可能是&#xff1a;1、文件大小/文件类型等是否有问题&#xff0c;公司用的是七牛的文件服务器&#xff0c;对文件上…

淘宝扭蛋机源码解析:功能实现与技术细节

随着在线购物和娱乐的融合&#xff0c;淘宝扭蛋机作为一种创新的购物娱乐方式&#xff0c;受到了广大用户的喜爱。本文将深入解析淘宝扭蛋机的源码&#xff0c;探讨其功能实现与技术细节&#xff0c;以期为开发者们提供一些有价值的参考。 一、功能实现 1.用户登录与注册 淘宝…

《令狐带你阅读JDK源码之简单集合ArrayList》

文章目录 Java简单集合ArrayList继承体系源码解析 总结 大家好哈&#xff0c;欢迎来到令狐小哥本期专栏&#xff0c;这期专栏主要是带着大家阅读JDK源码&#xff0c;我会分几期篇幅来介绍这个jdk源码、会进行剖析、梳理&#xff0c;欢迎大家指正阅读。后面我会配套自己的视频进…

【C++题解】1090 - 同因查找

问题&#xff1a;1090 - 同因查找 类型&#xff1a;for循环、简单循环 题目描述&#xff1a; 求出 10 至 1000 之内能同时被2、3、7 整除的数&#xff0c;并输出。 每行一个。 输入&#xff1a; 无。 输出&#xff1a; 按要求输出满足条件的数&#xff0c;每行 1 个。 完…

TiDB-从0到1-配置篇

TiDB从0到1系列 TiDB-从0到1-体系结构TiDB-从0到1-分布式存储TiDB-从0到1-分布式事务TiDB-从0到1-MVCCTiDB-从0到1-部署篇TiDB-从0到1-配置篇 一、系统配置 TiDB的配置分为系统配置和集群配置两种。 其中系统配置对应TiDB Server&#xff08;不包含TiKV和PD的参数&#xff0…

GaussDB技术解读——GaussDB架构介绍(一)

目录 1 GaussDB 关键架构目标 2 GaussDB分布式架构 2.1 GaussDB 分布式关键技术架构 3 数据计算路由层&#xff08;Coordinator&#xff09;关键技术方案 3.1 分布式优化器 3.2 分布式执行框架 GaussDB是华为自主创新研发的关系型数据库&#xff0c;基于华为在数据库领域…

vivo手机如何改ip地址

在数字化时代&#xff0c;网络已成为我们日常生活和工作中不可或缺的一部分。而IP地址&#xff0c;作为网络连接的唯一标识&#xff0c;有时出于安全或隐私的需要&#xff0c;我们可能希望对其进行更改。对于使用vivo手机的用户来说&#xff0c;如何轻松修改IP地址可能是一个令…

2024后端服务架构升级

文章目录 背景改造方案新架构图技术选型思考 服务拆分公共组件设计自部署算法服务排期计划 全球多活改造背景架构图分布式ID大表分区处理范围使用用途改造方案排期计划升级预算 背景 1、xx业务经过多轮的业务决策和调整&#xff0c;存在非常多技术包袱&#xff0c;带了不好的用…

Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子:轨道交通监控系统

株洲中车时代电气股份有限公司&#xff08;下称中车时代电气&#xff09;是中国中车旗下股份制企业&#xff0c;其前身及母公司——中车株洲电力机车研究所有限公司创立于1959年。中车时代电气扎根株洲&#xff0c;走好两条钢轨&#xff0c;走出两条钢轨。中车时代电气秉承“双…

Flink系列三:Flink架构、独立集群搭建及Flink on YARN模式详解

一、Flink架构 Flink 是一个分布式系统&#xff0c;需要有效分配和管理计算资源才能执行流应用程序。它集成了所有常见的集群资源管理器&#xff0c;例如Hadoop yarn&#xff0c;但也可以设置作为独立集群甚至库运行。 Flink 集群剖析 Flink 运行时由两种类型的进程组成&…

【自然语言处理】【Scaling Law】Observational Scaling Laws:跨不同模型构建Scaling Law

相关博客 【自然语言处理】【Scaling Law】Observational Scaling Laws&#xff1a;跨不同模型构建Scaling Law 【自然语言处理】【Scaling Law】语言模型物理学 第3.3部分&#xff1a;知识容量Scaling Laws 【自然语言处理】Transformer中的一种线性特征 【自然语言处理】【大…

Innodb Buffer Pool缓存机制(三)Innodb Buffer Pool内部组成

一、控制块缓存页 Buffer Pool中默认的缓存页大小和在磁盘上默认的页大小是一样的&#xff0c;都是16KB。为了更好的管理这些在Buffer Pool中的缓存页&#xff0c;InnoDB为每一个缓存页都创建了一些所谓的控制信息&#xff0c;这些控制信息包括该页所属的表空间编号、页号、缓存…

自动控制:自治系统与非自治系统的稳定性分析

自动控制&#xff1a;自治系统与非自治系统的稳定性分析 在自动控制领域&#xff0c;理解自治系统和非自治系统的区别对于分析系统稳定性至关重要。自治系统的运动方程只与系统的状态有关&#xff0c;而非自治系统的运动方程则与系统的状态和时间都有关系。本文将探讨非自治系…

SqlServer2016企业版安装

前言 好久没有知识的累积&#xff0c;最近工作上遇到新的SqlServer2016安装&#xff0c;记录一下 参考文章 SQL Server 2016软件安装包和安装教程 - 哔哩哔哩 (bilibili.com) 安装包准备 需要提前准备软件安装包如下 cn_sql_server_2016_enterprise_x64_dvd_8699450&…

3. 使用tcpdump抓取rdma数据包

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