算法Day58 | 单调栈,739. 每日温度,496.下一个更大元素 I

news/2024/11/24 6:54:46/

Day58

    • 单调栈
    • 739. 每日温度
    • 496.下一个更大元素 I

单调栈

单调栈是一种特殊的数据结构,它可以用于解决一类与单调性有关的问题。

单调栈的特点是栈内的元素按照单调递增或递减的顺序排列。所求左右元素比当前,则选择从栈顶到栈底是递增,所求左右元素比当前,则选择从栈顶到栈底是递减

维护栈的单调性为从栈顶到栈底是递增
如果当前元素小于等于栈顶元素,则该元素入栈;
如果当前元素大于等于栈顶元素,则栈顶元素出栈,输出数组通过栈顶的元素的出栈来获取后,当前元素入栈。

单调栈的本质是空间换时间,因为在遍历的过程中需要用一个来记录右边第一个比当前元素高的元素,优点是整个数组只需要遍历一次。


739. 每日温度

题目链接:739. 每日温度
求数组中比当前元素大或者小的位置,选择单调栈结构。

通常单调栈放入的元素为索引

由于输出的数组中所求的是比当前元素大,因此栈的单调性为从栈顶到栈底是递增

class Solution {
public:vector<int> dailyTemperatures(vector<int>& temperatures) {vector<int> res(temperatures.size(), 0);stack<int> st({0});for (int i = 1; i < temperatures.size(); ++i) {if (temperatures[i] <= temperatures[st.top()]) {st.push(i);} else {while (!st.empty() && temperatures[i] > temperatures[st.top()]) {res[st.top()] = i - st.top();st.pop();}st.push(i);}}return res;}
};

无论当前元素是否和栈顶元素大小,都要入栈,因此可以将ifelse简写;st也不用初始化,因为for从第0个元素开始遍历

class Solution {
public:vector<int> dailyTemperatures(vector<int>& temperatures) {vector<int> res(temperatures.size(), 0);stack<int> st;for (int i = 0; i < temperatures.size(); ++i) {while (!st.empty() && temperatures[i] > temperatures[st.top()]) {res[st.top()] = i - st.top();st.pop();}st.push(i);}return res;}
};

496.下一个更大元素 I

题目链接:496.下一个更大元素 I
和上一题的区别是nums1中的元素是根据num2元素的位置来输出的。因此存在一个由nums1的元素提取nums2的操作。可以使用unordered_map来完成这一步骤,将nums1的元素与索引关联起来。

输出数组的索引可以通过unordered_map来获取,因此栈可以直接存储num2的元素

class Solution {
public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {vector<int> res(nums1.size(), -1);stack<int> st;unordered_map<int, int> mp; //<nums1[i], i>for (int i = 0; i < nums1.size(); ++i) {mp[nums1[i]] = i;}for (auto& num2 : nums2) {while (!st.empty() && num2 > st.top()) {if (mp.find(st.top()) != mp.end()) {res[mp[st.top()]] = num2;}st.pop();}st.push(num2);}return res;}
};


http://www.ppmy.cn/news/779572.html

相关文章

Oracle迁移表空间文件

一、针对可offline的非系统表空间 1.查看要改变的表空间的数据文件信息 select tablespace_name,file_name,online_status from dba_data_files where tablespace_name表空间名称; 2.将目标表空间设置为脱机状态 alter tablespace 表空间名称 offline; 3.再次查看目标表空间的…

camera 驱动原理

相机驱动的原理主要涉及到将相机捕获的图像数据转化为计算机可识别的数字信号&#xff0c;并通过软件或驱动程序来控制相机的功能和参数。 通常&#xff0c;相机驱动通过读取相机的数字接口&#xff0c;例如 USB 或 Firewire&#xff0c;来连接相机与计算机。驱动程序利用协议(…

计算机色彩学,浅析色彩原理

颜色是如何形成并被我们感知的? 不同波长的可见光对应着不同的色彩,当光线反射到眼睛里就形成了不同的色彩: 上图为三棱镜所折射出的不用波长的可见光 1. 颜色是由于某些特定波长的可见光射入视网膜造成的,视网膜边缘的杆状细胞可以区分光亮和黑暗,而中央的锥状细胞还能分…

黑白和彩色CCD摄像机成像原理简介

1.1黑白&#xff08;单色&#xff09;相机 CCD原理并不复杂。我们可以把它想象成一个顶部被打开的记忆芯片。因此光束可以射到记忆单元中。根据"光电效应”&#xff0c;这些光束在记忆单元中产生负电荷&#xff08;下图中右上部分&#xff09;。 曝光后&#xff0c;这些电…

计算机辅助设计的简单原理,CAD/CAM基本原理

CAD/CAM基本原理 一 数据获取 数据获取(data acquisition)亦称牙颌三维形状测量及计算机图像化。相当于传统方法中的印模制取和模型制备。目前,测量方式和测量方法很多,分述如下: 1 测量方式: ①从口腔内直接摄取三维信息,它取代了传统的取印模、灌模型的方法。②从石膏…

ISP概述、工作原理及架构

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/lz0499/article/details/71156291 </div><link rel"stylesheet" href"https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views…

相机曝光原理

摘要&#xff1a;自动曝光本质是通过控制曝光时间和光圈大小来控制亮度&#xff0c;是整体图像达到最佳亮度效果。 1.曝光简述 正确的曝光值对图像有着重要影响&#xff0c;曝光过度照片看起来会过亮&#xff0c;曝光不足图片看起来会太暗。在摄像机中自动曝光模块用于调整照射…

雪花算法原理_孙略 | 雪花工场

原文发表于《中国摄影》杂志2019年第1期&#xff0c;是为专题“2019&#xff1a;科学世界影像漫游”的一部分。图文作者均为孙略。 孙略1976年生于北京&#xff0c;毕业于清华大学&#xff0c;现任教于北京电影学院&#xff0c;博士、副教授。长期从事影像创作及影像技术理论研…