代碼隨想錄算法訓練營第62/63天| 503.下一個更大元素II、42. 接雨水、84.柱狀圖中最大的矩形

文章目錄

  • 503.下一個更大元素II
    • 思路
    • 代碼
  • 42. 接雨水
    • 思路
    • 代碼
  • 84.柱狀圖中最大的矩形
    • 思路
    • 代碼

503.下一個更大元素II

題目鏈接:503.下一個更大元素II
文章講解:代碼隨想錄|503.下一個更大元素II

思路

和739. 每日溫度 (opens new window)也幾乎如出一轍,區別于在遍歷的過程中模擬走兩邊nums

代碼

class Solution {
public:vector<int> nextGreaterElements(vector<int>& nums) {vector<int> result(nums.size(), -1);if (nums.size() == 0) return result;stack<int> st;st.push(0);for (int i = 1; i < nums.size() * 2; i++) { // 模擬遍歷兩邊nums,注意一下都是用i % nums.size()來操作if (nums[i % nums.size()] < nums[st.top()]) st.push(i % nums.size());else if (nums[i % nums.size()] == nums[st.top()]) st.push(i % nums.size()); else {while (!st.empty() && nums[i % nums.size()] > nums[st.top()]) {result[st.top()] = nums[i % nums.size()];st.pop();}st.push(i % nums.size());}}return result;}
};

42. 接雨水

題目鏈接:42. 接雨水
文章講解:代碼隨想錄|42. 接雨水

思路

尋找右邊第一個比自己大的元素,來計算雨水面積
單調棧是按行計算的
在這里插入圖片描述
一旦發現添加的柱子高度大于棧頭元素了,此時就出現凹槽了,棧頭元素就是凹槽底部的柱子,棧頭第二個元素就是凹槽左邊的柱子,而添加的元素就是凹槽右邊的柱子
在這里插入圖片描述
遇到相同的元素,更新棧內下標,就是將棧里元素(舊下標)彈出,將新元素(新下標)加入棧中
在這里插入圖片描述

代碼

class Solution {
public:int trap(vector<int>& height) {int result = 0;stack<int> stk;stk.push(0);int mid, h, w;for(int i = 1; i < height.size(); i++){if(height[i] < height[stk.top()]) stk.push(i);else if(height[i] == height[stk.top()]){stk.pop();stk.push(i);}else{while(!stk.empty() && height[i] > height[stk.top()]){mid = stk.top();stk.pop();if (!stk.empty()) {h = min(height[i], height[stk.top()]) - height[mid];w = i - stk.top() - 1;result += h * w;}}stk.push(i);}}return result;}
};

stk.pop();后要記得判斷if (!stk.empty()),因為有時候可能沒有左邊的柱子

84.柱狀圖中最大的矩形

題目鏈接:84.柱狀圖中最大的矩形
文章講解:代碼隨想錄|84.柱狀圖中最大的矩形

思路

  1. 接雨水 (opens new window)是找每個柱子左右兩邊第一個大于該柱子高度的柱子,而本題是找每個柱子左右兩邊第一個小于該柱子的柱子。
    只有棧里從大到小的順序,才能保證棧頂元素找到左右兩邊第一個小于棧頂元素的柱子。

代碼

class Solution {
public:int largestRectangleArea(vector<int>& heights) {int result = 0;stack<int> st;heights.insert(heights.begin(), 0); // 數組頭部加入元素0heights.push_back(0); // 數組尾部加入元素0st.push(0);// 第一個元素已經入棧,從下標1開始for (int i = 1; i < heights.size(); i++) {if (heights[i] > heights[st.top()]) { // 情況一st.push(i);} else if (heights[i] == heights[st.top()]) { // 情況二st.pop(); // 這個可以加,可以不加,效果一樣,思路不同st.push(i);} else { // 情況三while (!st.empty() && heights[i] < heights[st.top()]) { // 注意是whileint mid = st.top();st.pop();if (!st.empty()) {int left = st.top();int right = i;int w = right - left - 1;int h = heights[mid];result = max(result, w * h);}}st.push(i);}}return result;}
};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/714920.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714920.shtml
英文地址,請注明出處:http://en.pswp.cn/news/714920.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++/數據結構:AVL樹

目錄 一、AVL樹的概念 二、AVL樹的實現 2.1節點定義 2.2節點插入 三、AVL樹的旋轉 3.1新節點插入較高左子樹的左側&#xff1a;右單旋 3.2新節點插入較高右子樹的右側&#xff1a;左單旋 3.3新節點插入較高左子樹的右側---左右&#xff1a;先左單旋再右單旋 3.4新節點插…

Rocky Linux 運維工具 Systemd

一、Systemd 的簡介 Systemd是一個用于管理Linux系統啟動進程和服務的系統和服務管理器&#xff0c;取代了傳統的init系統。它提供了并行啟動、依賴關系管理、動態加載服務文件等功能&#xff0c;成為現代Linux發行版中主流的初始化系統。 二、Systemd 的參數說明 [Unit] Des…

SLAM基礎知識-卡爾曼濾波

前言&#xff1a; 在SLAM系統中&#xff0c;后端優化部分有兩大流派。一派是基于馬爾科夫性假設的濾波器方法&#xff0c;認為當前時刻的狀態只與上一時刻的狀態有關。另一派是非線性優化方法&#xff0c;認為當前時刻狀態應該結合之前所有時刻的狀態一起考慮。 卡爾曼濾波是…

SD NAND:為車載顯示器注入智能與安全的心臟

SD NAND 在車載顯示器的應用 在車載顯示器上&#xff0c;SD NAND&#xff08;Secure Digital NAND&#xff09;可以有多種應用&#xff0c;其中一些可能包括&#xff1a; 導航數據存儲&#xff1a; SD NAND 可以用于存儲地圖數據、導航軟件以及車載系統的相關信息。這有助于提…

微服務day03-Nacos配置管理與Nacos集群搭建

一.Nacos配置管理 Nacos不僅可以作為注冊中心&#xff0c;可以進行配置管理 1.1 統一配置管理 統一配置管理可以實現配置的熱更新&#xff08;即不用重啟當服務發生變更時也可以直接更新&#xff09; dataId格式&#xff1a;服務名-環境名.yaml&#xff0c;分組一般使用默認…

InnoDB高級特性篇(5)-使用InnoDB的全文索引

InnoDB是MySQL數據庫的一個關系型存儲引擎。它提供了很多強大的功能&#xff0c;其中一個重要的功能是全文索引。全文索引允許我們在文本數據中進行高效的搜索&#xff0c;以找到包含特定關鍵詞的記錄。在本文中&#xff0c;我們將詳細介紹如何在InnoDB中使用全文索引。 首先&…

藍橋杯備戰刷題two(自用)

1.楊輝三角形 #include<iostream> using namespace std; #define ll long long const int N2e510; int a[N]; //1 0 0 0 0 0 0 //1 1 0 0 0 0 0 //1 2 1 0 0 0 0 //1 3 3 1 0 0 0 //1 4 6 4 1 0 0 //1 5 10 10 5 1 //前綴和思想 //第一列全為1,第二列為從0開始遞增1的序…

信息檢索(七):Transformer Memory as a Differentiable Search Index

Transformer Memory as a Differentiable Search Index 摘要1. 引言2. 相關工作3. 可微搜索索引3.1 索引策略3.1.1 索引方法3.1.2 文檔表示策略 3.2 用于檢索的 Docids 表示3.3 訓練和優化 4. 實驗4.1 基線4.2 實驗結果 5. 結論參考資料 原文鏈接&#xff1a;https://proceedin…

Revit-二開之創建線性尺寸標注-(5)

創建線性尺寸標注 對應的Revit界面的按鈕 線性尺寸標注源碼 本篇文章實現的邏輯是從rvt文章中拾取一面墻,然后對墻添加再水平方向上的線性尺寸標注 protected override Result OnExecute(ExternalCommandData commandData, ref string message, ElementSet elements

LeetCode 刷題 [C++] 第55題.跳躍游戲

題目描述 給你一個非負整數數組 nums &#xff0c;你最初位于數組的 第一個下標 。數組中的每個元素代表你在該位置可以跳躍的最大長度。 判斷你是否能夠到達最后一個下標&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 題目分析 題目中…

2.1 mov、add和sub加減指令實操體驗

匯編語言 1. mov操作 1.1 mov移動值 mov指令把右邊的值移動到左邊 mount c d:masm c: debug r ax 0034 r 073f:0100 mov ax,7t1.2 mov移動寄存器的值 把右邊寄存器的值賦值給左邊的寄存器 a 073f:0105 mov bx,axt1.3 mov高八位&#xff08;high&#xff09;和低八位&am…

設計模式——中介者模式(mediator pattern)

概述 如果在一個系統中對象之間的聯系呈現為網狀結構&#xff0c;如下圖所示。對象之間存在大量的多對多聯系&#xff0c;將導致系統非常復雜&#xff0c;這些對象既會影響別的對象&#xff0c;也會被別的對象所影響&#xff0c;這些對象稱為同事對象&#xff0c;它們之間通過彼…

json---->如何把對象以json的形式傳遞給后端?

把對象以json的形式傳遞有很多種&#xff0c;先寫一種&#xff0c;后期再補充 &#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&…

?用細節去解釋,如何打造一款行政旗艦車型

高山行政加長版應該是這個級別里最大的幾款 MPV 之一了&#xff0c;對于一款較大的車型&#xff0c;其最重要的是解決行駛的便利性。 這次我們就試試魏牌高山行政加長版&#xff0c;從產品本身出發看幾個緯度的細節&#xff1a; 行政該如何定義加長后產品的功能變化加長之后到…

Ladder類創建梯形對象共享一個下底

package Absent;public class Chapter5 {public static void main(String[] args) {Ladder.bottom100;Ladder ladderOnenew Ladder();Ladder ladderTwonew Ladder();ladderOne.top23;ladderTwo.top34;System.out.println("ladderOne的上底&#xff1a;"ladderOne.get…

代碼隨想錄算法訓練營(動態規劃9)|198.打家劫舍 213.打家劫舍II 337.打家劫舍III

今天就是打家劫舍的一天,微笑 198.打家劫舍 leetcode題目鏈接 視頻講解 文章講解 動規五部曲分析如下&#xff1a; 確定dp數組&#xff08;dp table&#xff09;以及下標的含義 dp[i]&#xff1a;考慮下標i&#xff08;包括i&#xff09;以內的房屋&#xff0c;最多可以偷竊…

Java 數組(詳細)

目錄 一、數組的概述 1. 數組的理解&#xff1a; 2. 數組相關的概念&#xff1a; 3. 數組的特點&#xff1a; 4. 數組的分類&#xff1a; 5.數據結構&#xff1a; 二、一維數組 1. 一維數組的聲明與初始化 2. 一維數組元素的引用&#xff1a; 3. 數組的屬性&#xff1…

Scikit-Learn邏輯回歸

Scikit-Learn邏輯回歸 1、邏輯回歸概述1.1、邏輯回歸1.2、邏輯回歸的優缺點1.3、邏輯回歸與線性回歸2、邏輯回歸的原理2.1、邏輯回歸的概念與原理2.2、邏輯回歸的損失函數2.3、梯度下降法求解邏輯回歸的最優解3、Scikit-Learn邏輯回歸3.1、決策邊界3.2、Scikit-Learn邏輯回歸AP…

【Java數據結構 -- 二叉樹+樹的深度優先遍歷】

二叉樹 1. 二叉樹1.1 二叉樹的介紹1.2 兩種特殊的二叉樹1.3 二叉樹的性質1.4 二叉樹的存儲 2. 二叉樹的基本操作2.1 二叉樹的創建2.2 二叉樹的優先遍歷2.3 遞歸實現二叉樹遍歷2.4 用非遞歸實現二叉樹遍歷 1. 二叉樹 1.1 二叉樹的介紹 二叉樹是一種數據結構&#xff0c;一顆二…

【python、nlp、transformer】transformer學習部分

注&#xff1a; 此博文僅為了解transformer架構&#xff0c;如果使用&#xff0c;建議直接調用庫就行了 Transformer的優勢 相比之前占領市場的LSTM和GRU模型&#xff0c;Transformer有兩個顯著的優勢&#xff1a; 1. Transformer能夠利用分布式GPU進行并行訓練&#xff0c…