day-29 代码随想录算法训练营 回溯part5

news2024/12/26 23:26:51

491.递增子序列

分析:存在重复元素,求递增子序列思路:1.树层去重2.当 i>0 时当前位大于上一位 

 

 思路:

  • 去重逻辑在每一层都需要重新创建(每一层遍历),且不能影响到下一层递归
class Solution {
public:
    vector<vector<int>>res;
    vector<int>mid;
    
    void backtrace(vector<int>&nums,int startIndex){
        if(mid.size()>=2)
            res.push_back(mid);
        if(startIndex==nums.size())
            return;
        unordered_set<int>upset;//只影响该树层
        for(int i=startIndex;i<nums.size();i++){
            if(!mid.empty() && mid.back()>nums[i])//递增序列条件
                continue;
            if(upset.find(nums[i])!=upset.end())//该树层存在重复值,并且不是第一次遍历
                continue;
            upset.insert(nums[i]);//记录第一次遍历
            mid.push_back(nums[i]);
            backtrace(nums,i+1);
            mid.pop_back();
        }
    }
    vector<vector<int>> findSubsequences(vector<int>& nums) {
        backtrace(nums,0);
        return res;
    }
};

46.全排列

思路一:直接在结果数组中查找是否出现过此下标
思路二:使用set进行下标去重
class Solution {
public:
    vector<vector<int>>res;
    vector<int>mid;
    unordered_set<int>index;
    void backtrace(vector<int>&nums,int start){
        if(start==nums.size()){
            res.push_back(mid);
            return;
        }

        for(int i=0;i<nums.size();i++){
            if(index.find(i)!=index.end())//在树枝中进行下标去重
                continue;
            index.insert(i);
            mid.push_back(nums[i]);
            backtrace(nums,start+1);
            mid.pop_back();
            index.erase(i);
        }
    }
    //树枝去重
    vector<vector<int>> permute(vector<int>& nums) {
        backtrace(nums,0);
        return res;
    }
};

47.全排列||

思路一:进行树枝的去重,树层的去重直接使用find函数
思路二:树层去重(需要排序)+树枝去重
分析:本质上还是树层去重,在上一题全排列的基础上,每一层的遍历中有重复元素

class Solution {
public:
    vector<vector<int>>res;
    vector<int>mid;
    unordered_set<int>index;//记录递归下标
    
    void backtrace(vector<int>&nums,int start,vector<bool>&used){
        if(start==nums.size()){
            res.push_back(mid);
            return;
        }
        
        for(int i=0;i<nums.size();i++){
            if(i>0 && nums[i]==nums[i-1] && !used[i-1])//树层重复元素去重(used避免的树枝的去重,因为存在重复元素)
                continue;
            if(index.find(i)!=index.end())//树枝下标元素去重
                continue;
            index.insert(i);//树枝递归记录下标
            used[i]=true;//树枝递归记录使用
            mid.push_back(nums[i]);
            backtrace(nums,start+1,used);
            mid.pop_back();
            index.erase(i);
            used[i]=false;
        }
    }
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        sort(nums.begin(),nums.end());//需要排序
        vector<bool>used(nums.size(),false);//记录重复值的使用
        backtrace(nums,0,used);
        return res;
    }
};

 455.分发饼干

思路:先排序,按最大的胃口和最大的饼干数来分配,使用双指针倒序遍历计数
class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        sort(g.begin(),g.end());
        sort(s.begin(),s.end());
        int i=g.size()-1,j=s.size()-1;
        int sum=0,maxsum=0;
        while(i>=0 && j>=0){
            if(s[j]>=g[i]){
                j--;
                i--;
                sum++;
            }
            else
                i--;
            maxsum=max(maxsum,sum);
        }
        return maxsum;
    }
};

376.摆动序列

分析:考虑三种情况
  • 存在单调增和单调减
  • 存在平区间
  • 在单调增或单调减中存在平区间
思路:遍历序列,采用三个变量,前数与当前数之差prediff,当前数与下一个数之差curdiff,摆动序列总长度sum。
当出现摆动时,即出现峰值:
  • 单调区间直接判断prediff和curdiff一正一反;
  • 平区间则判断prediff==0的情况下,若curdiff不为0则有摆动
  • 出现峰值才更新preidff,不然在单调区间内存在平区间,就会导致每个平区间多一个记录
class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        //思路一:直接计算峰顶和峰底的个数
        if(nums.size()<=1) return nums.size();
        int curDiff=0;//当前数和后一个数的差值
        int preDiff=0;//前一个数和当前数的差值(初始化为0方便第一个元素计算)
        int sum=1;
        for(int i=0;i<nums.size()-1;i++){
            curDiff=nums[i+1]-nums[i];
            //出现峰值的情况
            if((preDiff<=0 && curDiff>0) || (preDiff>=0 && curDiff<0)){
                sum++;
                preDiff=curDiff;//峰值出现后更新prediff
            }
        }
        return sum;
    }
};

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

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

相关文章

认识SpringIOC容器

目录 一、SpringFrameWork 二、SpringIOC容器 三、SpringIoc的核心功能 一、SpringFrameWork 1.SpringFrameWork与Spring之间的关系 SpringFrameWork是SpringCould、SpringMVC等等技术的基础实现的&#xff0c;而所有的SpringCloud、SpringFrameWork、SpringMVC等等技术组…

spring之深入理解Spring框架的核心模块与功能

深入理解Spring框架的核心模块与功能 标题: 深入理解Spring框架的核心模块与功能摘要:引言:词汇解释:详细介绍:详细介绍Spring的核心模块&#xff1a;Spring Core、Beans、ContextSpring Core:Beans:Context: 注意事项:Spring数据访问模块&#xff1a;JDBC、ORM、事务管理JDBC&…

【LVS集群】

目录 一、集群概述 1.负载均衡技术类型 2.负载均衡实现方式 二、LVS结构 1.三层结构 2.架构对象 三、LVS工作模式 四、LVS负载均衡算法 1.静态负载均衡 2.动态负载均衡 五、ipvsadm命令详解 1. -A 2. -D 3. -L 4. -a 5. -d 6. -l 7. -t 8. -s 9. -r 10. -…

【IDEA配置创建类注释模板和方法模板教程】

IDEA配置创建类注释模板和方法模板教程 废话不多说直接上干货 废话不多说直接上干货 先看效果: 类: 方法: IDEA类注释模板 &#xff0c;配置步骤&#xff1b; 直接用模板: /*** description: ${description}* author: Lynn.OuYang* create: ${YEAR}-${MONTH}-${DAY} ${HOU…

实验六 u-boot-2013.01移植

【实验目的】 了解u-boot 的代码结构及移植的基本方法 【实验环境】 ubuntu 14.04发行版FS4412实验平台交叉编译工具arm-none-linux-gnueabi- 【注意事项】 实验步骤中以“$”开头的命令表示在 ubuntu 环境下执行 【实验步骤】 一、建立自己的平台 下载uboot源码 在uboo…

怎么检测UI卡顿?(线上及线下)

什么是UI卡顿&#xff1f; 在Android系统中&#xff0c;我们知道UI线程负责我们所有视图的布局&#xff0c;渲染工作&#xff0c;UI在更新期间&#xff0c;如果UI线程的执行时间超过16ms&#xff0c;则会产生丢帧的现象&#xff0c;而大量的丢帧就会造成卡顿&#xff0c;影响用…

PDF校对工具正式上线,为用户提供卓越的文档校对解决方案

为满足当下对数字化文档校对的精准需求&#xff0c;我们今日正式发布全新的PDF校对工具。经过深入的技术研发与细致的测试&#xff0c;该工具旨在为企业和个人用户带来一个高效且准确的PDF文档校对平台。 PDF校对工具的主要特性&#xff1a; 1.全面性校对&#xff1a;工具支持…

尚硅谷大数据项目《在线教育之离线数仓》笔记003

视频地址&#xff1a;尚硅谷大数据项目《在线教育之离线数仓》_哔哩哔哩_bilibili 目录 第8章 数仓开发之DIM层 P039 P040 P041 P042 P043 P044 P045 P046 P047 P048 第8章 数仓开发之DIM层 P039 第8章 数仓开发之DIM层 DIM层设计要点&#xff1a; &#xff08;1&a…

项目计划怎么写? 6 个步骤助你万无一失

项目计划是项目管理的关键步骤&#xff0c;如果跳过这一步&#xff0c;项目还未启动就已岌岌可危。 什么是项目计划&#xff1f; 项目计划是实现特定目标或成果的详细路线图。它是一份全面的文件&#xff0c;回答了 “谁”、“什么”、“为什么”、"如何 "和 "…

美容行业如何快速搭建自己的预约小程序?

现在&#xff0c;搭建一个专属于美容行业的预约小程序不再是只有程序员才能做到的事情了。有了一些小程序制作平台的存在&#xff0c;任何人都可以轻松地制作出自己的小程序。下面&#xff0c;我将揭秘一个快速搭建专属美容行业预约小程序的秘诀。 首先&#xff0c;登录小程序制…

wazuh--sql检测

官网&#xff1a;Virtual Machine (OVA) - Installation alternatives Wazuh(Wazuh The Open Source Security Platform)&#xff1a;是一整套基于ossec安全检测工具和EFK日志工具构成的终端安全管理工具。不管是将其分类至HIDS&#xff0c;还是EDR&#xff0c;它都是一套通过…

【Linux】线程篇Ⅱ:

线程Ⅱ &#x1f517;接上篇【线程篇Ⅰ】五、线程库 和 线程 id六、同步与互斥 &#x1f517;接上篇【线程篇Ⅰ】 &#x1f449;【Linux】线程篇Ⅰ&#xff1a;线程和task_struct 执行流的理解、相关接口命令、线程异常、线程的私有和共享 五、线程库 和 线程 id 对于 Linux …

数藏平台遭到攻击怎么办?

数藏平台科技抢单以及DDoS攻击事件频发&#xff0c;造成服务器CPU耗尽&#xff0c;平台卡顿进不去&#xff0c;活动无法正常进行&#xff0c;攻击者入侵平台方数据库&#xff0c;恶意篡改账户余额&#xff0c;导致大量用户高价挂单仍可成交&#xff0c;最终导致数据异常&#x…

iFluor 594 Styramide是一种荧光染料,常用于生物分子标记和成像

试剂 | 基础知识概述&#xff08;部分&#xff09;: 中文名称&#xff1a;Alexa Fluor 594酪Styramide 分子量&#xff1a;1341.71 胺的优异替代品 100 Slides 英文名称&#xff1a;iFluor 594 Ex (nm)&#xff1a;588 Em (nm)&#xff1a;604 规格标准&#xff1a;1g&am…

docker快速上手运行js代码(dockerfile、镜像、容器、docker desktop图形化界面的基本使用、dockercompose)

1、导入&#xff1a; 1.1&#xff1a;准备js文件 我们本地有一个文件夹"docker_learn"&#xff0c;里面有一个index.js的文件&#xff0c;文件内只有一行代码 console.log("快速上手docker"); 1.2&#xff1a;运行js代码 我们使用vscode等ide打开这个…

pyqt5 多线程QThread自学记录

pyqt5多线程QThread自学记录 在编写qt的时候不加入多线程&#xff0c;运行程序往往会导致主进程卡死&#xff0c;比如执行下载某视频或者其他执行比较耗时的程序&#xff0c;泛滥了博客&#xff0c;就是没有理解怎么进行槽函数的关联和传递的 经过长时间的攻克&#xff0c;终于…

【附安装包】Dynaform 5.9.4安装教程

DYNAFORM是一款用于板料成形数值模拟的专用软件&#xff0c;是LS-DYNA求解器与ETA/FEMB前后处理器的完美结合&#xff0c;包含BSE、DFE、Formability三个大模块&#xff0c;几乎涵盖冲压模模面设计的所有要素&#xff0c;包括&#xff1a;定最佳冲压方向、坯料的设计、工艺补充…

界面设计软件都有哪些?推荐这7款

本文总结了7种“知名”软件界面设计工具&#xff0c;建议您尝试各种选择&#xff0c;以找到最适合您的UI设计工具。 对于UI设计师来说&#xff0c;应用程序的界面设计和制作是最常见的。面对设计师的需求&#xff0c;市场上出现了各种各样的软件界面设计工具&#xff0c;百花齐…

国标GB28181视频平台EasyGBS国标平台无法正常启动的问题解决方案

EasyGBS国标视频云服务是基于国标GB/T28181协议的视频能力平台&#xff0c;可实现的视频功能包括&#xff1a;实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台部署简单、可拓展性强&#xff0c;支持将接入的视频流进行全终端、全平台分发&#…

4-4 Representing text Exercise

本文所用资料下载 一. Representing text Let’s load Jane Austen’s Pride and Prejudice. We first split our text into a list of lines and pick an arbitrary line to focus on: with open(D:jane-austen/1342-0.txt, encodingutf8) as f:text f.read() lines text.…