Day59| 503. 下一个更大元素 II | 42. 接雨水 --三种方法:1.双指针 2.动态规划 3.单调栈

news2024/9/27 17:36:13

503. 下一个更大元素 II

注意点:

  1. 初始化了2倍的题目中的nums.size(),最后直接/2即可

  1. 分清逻辑nums[i] > nums[st.top()]的时候,才进行st.pop()操作

class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        vector<int> nums1(nums.begin(), nums.end());//提高运算速度
        nums.insert(nums.end(), nums1.begin(), nums1.end());
        // 初始化了2倍的题目中的nums.size(),最后直接/2即可
        vector<int> result(nums.size(), -1);
        stack<int> st;
        st.push(0);
        
        for(int i = 1; i< nums.size(); i++) {
            if(nums[i] <= nums[st.top()]) st.push(i);
            else {
                while(!st.empty() && nums[i] > nums[st.top()]) {
                    result[st.top()] = nums[i];
                    st.pop();
                }
                st.push(i);
            }
        }
        result.resize(result.size()/2);
        return result;
    }
};

42. 接雨水 -- 三种方法:1.双指针 2.动态规划 3.单调栈

注意点:

1.采用双指针的方法,主要的策略是获得i列左右两侧最高的if(height[l] > lHeight) lHeight = height[l];,然后对左右两侧最高值取最小值min(rHeight, lHeight),并与height[i]取差进行运算,最后所有的相加得到result,但是这种方法操作超时

class Solution {
public:
    int trap(vector<int>& height) {
        int result = 0;
        for(int i =0; i< height.size(); i++) {
            if(i == 0 || i == height.size()-1) continue;

            int rHeight = height[i];
            int lHeight = height[i];

            for(int r = i+1; r<height.size(); r++) {
                if(height[r] > rHeight) rHeight = height[r];
            }
            for(int l = i-1; l>=0; l--) {
                if(height[l] > lHeight) lHeight = height[l];
            }

            int h = min(rHeight, lHeight)-height[i];
            if(h>0)result +=h;
        }
        return result;
    }
};

2.采用动态规划方法

注意点:

  1. 对height[i]的左侧求最大值的递推公式是: maxLeft[i] = max(height[i], maxLeft[i-1]);同理对height[i]的右侧求最大值的递推公式是: maxRight[i] = max(height[i], maxRight[i+1]);

  1. 根据递推公式可以推出maxLeft[i]是从右到左进行遍历的,maxRight[i]是从右到左进行遍历的,所以进行了初始化

  1. 最后因为没有对height[0]和height[height.size()-1]进行排除,所以需要if判断一下如果是正数再进行加法

class Solution {
public:
    int trap(vector<int>& height) {
        
        vector<int> maxLeft(height.size(),0);
        vector<int> maxRight(height.size(),0);

        maxLeft[0] = height[0];
        // 根据递推公式得到左序遍历
        for(int i = 1; i<height.size(); i++) {
            // 递推公式,求对一个数左侧的最大值
            maxLeft[i] = max(height[i], maxLeft[i-1]);
        }


        maxRight[height.size()-1] = height[height.size()-1];
        // 根据递推公式得到右序遍历
        for(int i = height.size()-2; i>=1; i--) {
            // 求一个数右侧的最大值
            maxRight[i] = max(height[i], maxRight[i+1]);
        }

        
        int result = 0;
        for(int i = 0; i< height.size(); i++) {
            int h = min(maxLeft[i], maxRight[i])-height[i];
            // 因为没有对height[0]和height[height.size()-1]进行排除,所以需要if判断一下
            if (h >0)result +=h;
        }

        return result;

    }
};

单调栈

注意点:

1.这道题的思路:如果当前遍历的元素(柱子)高度大于栈顶元素的高度,此时就出现凹槽了

2.单调栈是顺序栈:栈头(元素从栈头弹出)到栈底的顺序应该是从小到大的顺序

3.当height[i] == height[st.top()]的时候将上一个弹出,以便最后计算横向数据的时候出现误差

class Solution {
public:
    int trap(vector<int>& height) {
        int result = 0;
        stack<int> st;
        st.push(0);
        for(int i = 1; i<height.size(); i++) {
            if(height[i] < height[st.top()]) {
                // 符合顺序遍历的顺序所以没有动
                st.push(i);
            } else if(height[i] == height[st.top()]) {
                // 当相等的时候需要将上一个弹出,以便计算w的时候没有误差
                st.pop();
                st.push(i);
            }else {
                while(!st.empty() && height[i] > height[st.top()]) {
                    int head = st.top();
                    // 将栈头扔掉
                    st.pop();
                    // if主要判断的是第0个元素
                    if(!st.empty()) {
                        // 计算纵向长度
                        int h = min(height[i], height[st.top()])-height[head];
                        // 计算横向长度
                        int w = i-st.top()-1;
                        // 最后计算面积
                        result += h*w;
                    }

                }
                st.push(i);
            }
        }
        return result;

    }
};

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

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

相关文章

STM32——独立看门狗

目录 看门狗产生背景 看门狗的作用 STM32 独立看门狗 独立看门狗特点 &#xff08;IWDG&#xff09; 独立看门狗常用寄存器 独立看门狗超时时间计算 独立看门狗工作原理 独立看门狗操作库函数 看门狗产生背景 当单片机的工作受到来自外界电磁场的干扰&#xff0c;造…

bert-bilstm-crf提升NER模型效果的方法

1.统一训练监控指标和评估指标评估一个模型的最佳指标是在实体级别计算它的F1值&#xff0c;而不是token级别计算它的的准确率&#xff09;。自定义一个f1值的训练监控指标传给回调函数PreliminaryTP&#xff1a;实际为P&#xff0c;预测为PTN&#xff1a;实际为N&#xff0c;预…

【Java IO流】缓冲流及原理详解

文章目录前言字节缓冲流原理字符缓冲流Java编程基础教程系列前言 前面我们已经学习了四种对文件数据操作的基本流&#xff0c;字节输入流&#xff0c;字节输出流&#xff0c;字符输入流&#xff0c;字符输出流。为了提高其数据的读写效率&#xff0c;Java中又定义了四种缓冲流…

LwIP系列--内存管理(堆内存)详解

一、目的小型嵌入式系统中的内存资源&#xff08;SRAM&#xff09;一般都比较有限&#xff0c;LwIP的运行平台一般都是资源受限的MCU。基于此为了能够更加高效的运行&#xff0c;LwIP设计了基于内存池、内存堆的内存管理以及在处理数据包时的pbuf数据结构。本篇的主要目的是介绍…

Ubuntu22.10安装和配置R/FSL/Freesurfer

2018年购入的台式机&#xff0c;一直处于吃灰状态&#xff0c;决定安装Ubuntu方便学习和使用一些基于Linux系统的软件。本文记录相关软件的安装和配置。>安装Ubuntu22.10<到官网下载ISO文件。将一个闲置U盘通过Rufus制作为安装盘。重启按F11设置引导盘&#xff0c;选择U盘…

国家实用新型发明专利:一种机器视觉的流水线智能检测报警系统

国家实用新型发明专利&#xff1a;一种机器视觉的流水线智能检测报警系统 【系统装置设计图】 文章目录国家实用新型发明专利&#xff1a;一种机器视觉的流水线智能检测报警系统【说明书摘要】【权利要求书】【说明书】***技术领域******背景技术******发明内容******有益效果…

C++类和对象(上): 封装与this指针

目录 一.前言 二. 类的引入和定义 1.C和C结构体的区别 2.C类的定义 3.类的成员方法的声明和定义是可分离的 三.面向对象之封装特性 1.封装思想的介绍 2.类封装编程模式的优点 四. 类实例(对象)的内存模型 五.this指针 章节导图&#xff1a; 一.前言 面向过程和面向对…

分享167个PHP源码,总有一款适合您

PHP源码 分享167个PHP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 167个PHP源码下载链接&#xff1a;https://pan.baidu.com/s/1fzoQ4_4VXc1e1ZHOUKuhbQ?pwdsb6s 提取码&#x…

数学表达式的处理

概述 在OJ上 会遇到一些这样的题目&#xff1a; 小明同学写数学四则运算&#xff0c;有把括号写多、写少、写错的情况&#xff0c;比如&#xff08;AB)*(C-D &#xff0c;请你输入一个表达式&#xff0c;判断此表达式的括号是否正确(不考虑运算的结果正确性)。 每次我看到 &q…

【操作系统】—— Windows压缩工具 “ Bandizip与7-zip ”(带你快速了解)

&#x1f4dc; “作者 久绊A” 专注记录自己所整理的Java、web、sql等&#xff0c;IT技术干货、学习经验、面试资料、刷题记录&#xff0c;以及遇到的问题和解决方案&#xff0c;记录自己成长的点滴。 &#x1f341; 操作系统【带你快速了解】对于电脑来说&#xff0c;如果说…

Python OpenCV 图片滑块验证码 滑块图片验证码 自动识别方案 模板匹配识别 识别成功率调试 源码分析 通用解决方案

前言 通过本专栏前面两篇文章大家已对图片滑块验证码有了初步的了解,对于滑块验证的实现和校验原理有了一定的了解,通过由浅入深的实战案例可直接应用于实战,对于滑块如何在前端实现滑动或接口调用可自行查阅相关资料实现,本文主要讲解 滑块验证码 模板匹配 识别的通用解决…

史上最详细的AVL树的实现(万字+动图讲解旋转)

&#x1f525;&#x1f525; 欢迎来到小林的博客&#xff01;&#xff01;       &#x1f6f0;️博客主页&#xff1a;✈️小林爱敲代码       &#x1f6f0;️文章专栏&#xff1a;✈️小林的C之路       &#x1f6f0;️欢迎关注&#xff1a;&#x1f44d…

[Python从零到壹] 六十三.图像识别及经典案例篇之图像漫水填充分割应用

祝大家新年快乐&#xff0c;阖家幸福&#xff0c;健康快乐&#xff01; 欢迎大家来到“Python从零到壹”&#xff0c;在这里我将分享约200篇Python系列文章&#xff0c;带大家一起去学习和玩耍&#xff0c;看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲…

创建者模式-原型模式

1.概述 用一个已经创建的实例作为原型&#xff0c;通过复制该原型对象来创建一个和原型对象相同的新对象 2.结构 原型模式包含如下角色&#xff1a; 抽象原型类&#xff1a;规定了具体原型对象必须实现的的 clone() 方法。具体原型类&#xff1a;实现抽象原型类的 clone() …

Spring AOP与Spring 事务

一、AOP讲解 创建普通对象UserService Component public class UserService{Autowiredprivate OrderService orderService;public void test(){System.out.println(orderService);}}创建代理对象UserServiceProxy&#xff0c;对test&#xff08;&#xff09;方法进行切面编程…

SSM项目 - 博客系统

1.SSM 版本的博客系统相较于 Servlet 版本的升级1. 框架升级 : SSM (SpringBoot Spring MVC MyBatis) MySQL Redis jQuery.2. 密码升级: 明文存储/md5存储 -> 加盐处理.3. 用户登录状态持久化升级: session 持久化到内存 - > session 持久化到 Redis. (后期有空实现…

cmake 03 一个可用的 cmake 工程应当是什么样的

cmake 学习笔记 代码地址: https://gitcode.net/u014254963/cmake-study/-/tree/master/hello_cmake_project https://gitcode.net/u014254963/cmake-study/-/tree/master/hello_cmake_project_vs 本文目标 多目录构建引用自己写的动态库关于单元测试的一些实践使用 python 脚…

Pandas-DataFrame基础知识点总结

1、DataFrame的创建 DataFrame是一种表格型数据结构&#xff0c;它含有一组有序的列&#xff0c;每列可以是不同的值。DataFrame既有行索引&#xff0c;也有列索引&#xff0c;它可以看作是由Series组成的字典&#xff0c;不过这些Series公用一个索引。 DataFrame的创建有多种…

JavaEE-多线程初阶4

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录多线程案例阻塞队列阻塞队列是什么生产者消费者模型标准库中的阻塞队列阻塞队列实现定时器定时器是什么标准库中的定时器实现定…

(第107篇)C规范编辑笔记(十三)

往期文章&#xff1a; C规范编辑笔记(一) C规范编辑笔记(二) C规范编辑笔记(三) C规范编辑笔记(四) C规范编辑笔记(五) C规范编辑笔记(六) C规范编辑笔记(七) C规范编辑笔记(八) C规范编辑笔记(九) C规则编辑笔记(十) C规范编辑笔记(十一) C规范编辑笔记(十二) 正文&#xff…