代码随想录 11.20 || 单调栈 LeetCode 503.下一个更大元素Ⅱ、42.接雨水

news2024/12/28 19:45:05

503.下一个更大元素Ⅱ

        本题与 496.下一个更大元素Ⅰ 如出一辙,求在给定一维数组中,每个元素右起第一个更大元素。不同之点在于,本题要求将一维数组视为首尾相连的,最后一个元素的下一个元素是第一个元素。问题的重点在于 如何使用单调栈处理循环数组。

    方法一:将原数组扩容到原来的两倍,即将 nums 拼接成 nums + nums,这样 nums[nums.size() - 1] 后面的元素就是 nums[0],数组在物理和逻辑上都变为循环的。然后,使用一个单调栈求解每个元素的下一个更大元素即可。

class Solution {
public:
    vector<int> nextGreaterElements(vector<int> &nums) {
        vector<int> nums1(nums.begin(), nums.end());
        nums.insert(nums.end(), nums1.begin(), nums1.end());

        vector<int> result(nums.size(), -1);
        stack<int> st;

        for (int i = 0; i < nums.size(); ++i) {
            while (!st.empty() && nums[i] > nums[st.top()]) {
                result[st.top()] = nums[i];
                st.pop();
            }
            
            st.push(i);
        }

        result.resize(nums.size() / 2);
        return result;
    }
};

        在上述代码中,我们将 nums数组的内容和长度扩容为原来的两倍。使用一个长度为扩容完后的 nums.size() 的容器作为结果集 result,在使用单调栈更新 result 后,需要将结果集 result resize 至原来的一半,因为在 result 中有一半的内容是重复的。

        方法二:事实上,扩容 nums 是为了能够在逻辑上使 nums[nums.size()] 和 nums[0] 相邻,而不必在物理上使元素也相邻,我们只要在遍历至末尾时,能够重新开始二次遍历 nums,即模拟走了两边数组。

class Solution {
public:
    vector<int> nextGreaterElements(vector<int> &nums) {
        int len = nums.size();

        vector<int> result(len, -1);
        stack<int> st;

        for (int i = 0; i < len * 2; ++i) {
            while (!st.empty() && nums[i % len] > nums[st.top()]) {
                result[st.top()] = nums[i % len];
                st.pop();
            }

            st.push(i % len);
        }

        return result;
    }
};

        在上述代码中,在 for 循环中遍历两倍长度的数组,使用 i % nums.size() 更新 result,事实上,单调栈中,nums 中的每个元素被压栈两次,result 结果集中的每个元素被更新了两次,但是每次的更新内容是一样的。这样空间复杂度减少为 O(1),没有使用到额外的空间,减少代码冗余。

42.接雨水

        给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。很复杂,我只能说很复杂。我们求每根柱子能装水的多少,然后将数量累加,即为给定数组能够装水的数量。每根柱子装水的容量,为以当前柱子为底,以两边最近的更高柱子为边形成的凹槽的容量。根据木桶的短板原理,木桶能装水的多少取决于最短的板子的长度,在本题中,一个凹槽能装水的多少取决于两个相邻的更高的柱子短的那一个。

           借助 代码随想录中对应章节的图描述,1 号柱子的容量为 0,其左边没有比其高的柱子,无法形成凹槽;2 号柱子的高度为 0,容量为 1,其右边相邻更高的柱子为 3 号,高度为 2,左边相邻更高柱子为 1号,高度为 1。此时,1,2,3 号柱子形成一个凹槽,凹槽的容量为 1 号柱子(比 3 号柱子矮) - 2 号的高度,1 - 0 = 1,此时说的容量其实为高度,还需要求得宽度,宽度为右边柱子的索引 - 左边柱子的索引 - 1,3 - 1 - 1 = 1,所以 2 号柱子的容量为 1 * 1 = 1。依次类推,计算后续每个柱子的容量,从图中可以看出,不是每个柱子都能形成凹槽,存在一些柱子的容量为 0。

        如何将上述过程转换为单调栈,其实就是求数组中每个元素其相邻右边第一个更大元素,和相邻左边第一个更大元素。借助一个单调递增栈,能够求当前元素右边第一个更大元素,此时栈顶元素为当前元素,将栈顶元素出栈之后,新的栈顶元素,即为当前元素左边第一个更大元素。

class Solution {
public:
    int trap(vector<int> &height) {
        int len = height.size();

        int result = 0;
        stack<int> st;

        for (int i = 0; i < len; ++i) {
            while (!st.empty() && height[i] > height[st.top()]) {
                int index = st.top();
                st.pop();
                if (!st.empty()) {
                    int h = min(height[i], height[st.top()]) - height[index];
                    int w = i - st.top() - 1;
                    result += h * w;
                }
            }
            st.push(i);
        }

        return result;
    }
};

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

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

相关文章

正版软件|PhotoPad 照片/图像编辑工具

编辑照片/图像从未如此简单&#xff01; 关于PhotoPad PhotoPad是本世纪最稳定、最易用且功能最全面的照片编辑器之一。 轻松编辑数码照片和其他图片。支持所有流行的图像格式快速裁剪、旋转、调整大小和翻转照片。 PhotoPad旨在快速打开和编辑照片&#xff0c;轻松无忧&…

Echarts设置环形图中心文字

方式一&#xff1a;title 通过在最外层设置title 配置项 title 同时也是环形图标题的配置项&#xff0c;只是通过left和top强制让其移动到环形图中间位置&#xff1b;提前设置好环形图 title: {// 图形标题(如果想要换行则使用ES6 模板字符串)// 例如&#xff1a; 示例// 这…

ros2工作空间

我们先不管ros2工作空间是什么样子的&#xff0c;如果是我自己来搞一个工作空间&#xff0c;我一定是这样安排 一个文件夹用来放自己存放的文件&#xff0c;。。。。。。。。。。对应src文件夹 一个文件夹用来放编译后的文件&#xff0c;。。。。。。。。。。。对应intall文件…

U4_1:图论之DFS/BFS/TS/Scc

文章目录 一、图的基本概念二、广度优先搜索&#xff08;BFS&#xff09;记录伪代码时间复杂度流程应用 三、深度优先搜索&#xff08;DFS&#xff09;记录伪代码时间复杂度流程时间戳结构BFS和DFS比较 四、拓扑排序一些概念有向图作用拓扑排序 分析伪代码时间复杂度彩蛋 五、强…

OpenAI一朝领导者山姆·奥尔特曼被解除职务,领导能力不再被认可?

原创 | 文 BFT机器人 在11月17日&#xff0c;OpenAI Inc.宣布CEO山姆奥尔特曼 (Sam Altman) 离职。掌舵人发生重大转变&#xff0c;董事会却在这个时候将公司首席技术官 Mira Murati推举为临时首席执行官&#xff0c;这一操作顿时引起了热议。 这突如其来的变化标志着OpenAI的…

C++实战学习笔记

文章目录 erase()uniquevector的insert()std::string::npos erase() &#xff08;1&#xff09;erase(pos,n); 删除从pos开始的n个字符&#xff0c;比如erase(0,1)就是删除第一个字符 &#xff08;2&#xff09;erase(position);删除position处的一个字符(position是个string类…

element表格分页+数据过滤筛选

目录 前言效果展示分页效果展示搜索效果展示 代码分析分页功能过滤数据功能 全部代码 前言 在el-element的标签里的tableData数据过多时&#xff0c;会导致表格页面操作卡顿。为解决这一问题&#xff0c;有以下解决方法&#xff1a; 分页加载&#xff1a; 将大量数据进行分页&…

Android File Transfer(安卓文件传输工具)

Android File Transfer 是一款安卓文件传输工&#xff0c;它允许在Mac操作系统和Android设备之间进行文件传输。 该软件通过USB连接将文件从Mac电脑传输到连接的Android设备&#xff0c;或者反过来从Android设备传输文件到Mac电脑。这包括照片、视频、音乐、文档和其他文件类型…

最新企业服务总线ESB的国内主要厂商和开源厂商排名,方案书价格多少

企业服务总线ESB是什么&#xff1f; ESB平台&#xff08;企业服务总线&#xff0c;Enterprise Service Bus&#xff09;是一种企业级集成平台&#xff0c;它提供了一种开放的、基于标准的消息机制&#xff0c;通过简单的标准适配器和接口&#xff0c;来完成粗粒度应用&#xff…

Qt程序打包成.exe可执行文件

1.使用Release进行编译 2.找到编译成功的地址: 找到对应的目录 3.把SerialTool.exe文件单独复制到一个文件夹,这里我直接在桌面创建一个SerialTool文件夹,这时候直接运行是不行的,我们需要把库都导进去 4. 在安装目录找到如下这个文件,点击打开,找到你电脑对应的版本即可,我这…

数据仓库:架构之详解Kappa和Lambda

目录 一、前言 二、架构详解 1 Lambda 架构 1.1 Lambda 架构组成 1.2 Lambda 特点 1.3 Lambda 架构的优点 1.4 Lambda 架构的不足 2 Kappa 架构 2.1 Kappa 架构的核心组件 2.2 Kappa 架构优点 2.3 Kappa 架构的注意事项 三、区别对比 四、选择时考虑因素 一、前言 …

录屏软件自动开启录视频,是如何实现的?

工作要留痕&#xff0c;作为职场人的一项必备技能&#xff0c;因此许多人在做一些重要操作的时候&#xff0c;就会提前开启录屏软件&#xff0c;把操作的每一个步骤进行录制&#xff0c;以避免在出现问题的时候进行检查。当每天都需要在固定的时间点重复某项工作的时候&#xf…

【AI实用技巧】GPT写sql统计语句

编写sql的统计语句是一项复杂的任务&#xff0c;特别是涉及多表的情况下。但有了GPT的帮助&#xff0c;一切变得轻松愉快。 AI7号 - 最强人工智能&#xff08;GPT&#xff09;中文版https://ai7.pro/s/9v2um 举例说明 有表结构如下&#xff1a; users(user_id, name) bills(…

家具生产ERP有哪几种?如何选择家具生产ERP

不同种类的家具产品有差异化的原材料和制造工艺&#xff0c;每道生产工艺又有不同的管理模式和难点&#xff0c;有些家具生产企业内部还存在各个业务环节信息传递不畅、财务核算不清、不能实时获取库存动态数据等情况。 形成对比的则是部分家具生产企业引入ERP系统完成数字化全…

「C++」虚函数与多态

&#x1f4bb;文章目录 &#x1f4c4;前言虚函数概念虚函数重写虚函数的协变 重载、覆盖&#xff08;重写&#xff09;、隐藏&#xff08;重定义&#xff09;的对比 多态多态的概念多态的定义与实现多态的类型多态的构成条件抽象类 多态的原理虚函数表 多继承中的虚函数表 &…

数字化转型背景下,企业如何做好知识管理?

在当今数字化转型的时代&#xff0c;企业面临着日益复杂和快速变化的商业环境。知识管理成为了企业成功的关键之一。有效地管理和利用知识资源可以提升企业的创新能力、决策质量和竞争力。以下我列了一些关键的点&#xff0c;讲讲在数字化转型背景下&#xff0c;企业如何可以做…

21款奔驰GLE350升级香氛负离子车载香薰

香氛负离子系统是由香氛系统和负离子发生器组成的一套配置&#xff0c;也可以单独加装香氛系统或者是负离子发生器&#xff0c;香氛的主要作用就是通过香氛外壳吸收原厂的香水再通过空调管输送到内饰中&#xff0c;而负离子的作用就是安装在空气管中通过释放电离子来打击空气中…

浪潮信息云峦服务器操作系统KeyarchOS体验与实践

写在前面 大家好我是网络豆&#xff0c;一名云计算运维人员&#xff0c;本文将会带大家体验一下浪潮信息服务器操作系统云峦KeyarchOS。看看浪潮信息服务器操作系统云峦KeyarchOS的优势与实践操作如何。 背景了解 KeyarchOS是浪潮信息基于Linux Kernel、OpenAnolis等开源技术…

【Python测试开发】:切换窗口和表单

一、多窗口切换 浏览器打开的窗口其实会有一个叫做句柄的概念。 句柄就类似于每一个标签页的ID一样&#xff0c;具有唯一性。 1.1 语法 获取当前窗口句柄&#xff0c;注意后面没有括号哦~ driver.current_window_handle获取所有窗口句柄&#xff0c;结果以列表格式存储&am…

『亚马逊云科技产品测评』活动征文|开发一个手机官网

『亚马逊云科技产品测评』活动征文&#xff5c;开发一个手机官网 授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 前言 …