leetcode_503 下一個更大元素

1. 題意

在一個循環數組中,找到下一個比它大的數。

2. 題解

也不知道怎么就單調棧了,可能是刷出來的吧。。。

還是來解釋一下吧!!!

如果有新元素入棧 c c c

那么在棧內的元素只要小于新元素的 s s s,都需要出棧,因為他們的

下一個更大的元素顯然就是 c c c。這些小于 s s s的棧內元素都需要出棧。

更進一步的說,棧內的元素它們都還沒有找到下一個更大的元素。

為什么是棧呢?因為我們先比較的是離當前元素最近的,

也就是后入棧的那些先比較,也就滿足了先進后出的特性。

那么單調性呢?因為在入棧時需要保證棧內元素是小于當前元素的,因

此棧內元素一定是單調遞減的,當然可以相等。

舉個例子

6 4 2 5 3 1s:
6  棧空直接入棧
s: 6
4  小于棧頂元素6,直接入棧
s: 6 4
2 小于棧頂元素4, 直接入棧
s:6 4 2
5 大于棧頂元素2, 2 出棧,且它的下一個比它大的元素就是5
s:6 4
5 大于棧頂元素4,4出棧,且它的下一個比它大的元素就是5
s: 6
5 小于棧頂元素6,5入棧
s:6 5
3 小于棧頂元素5,3入棧
s:6 5 3
1 小于棧頂元素3,1入棧
s: 6 5 3 1已經遍歷了一遍了,但是棧中還有元素,因此我們又從頭遍歷6 大于1, 1出棧,且下一個比它大的元素是6
6 大于3, 3出棧,且下一個比它大的元素是6
6 大于5, 5出棧,且下一個比它大的元素是6
6 不大于6, 6入棧
s: 6 6
后面的過程就重復上面的過程了

對于一個循環的數組,我們常常附加一個相同的數組來把它變成

線性的。在這里我們并沒有直接附加,而是采取了取模這種方式。

代碼其實就沒有那么重要了。。。

  • 正向遍歷
class Solution {
public:vector<int> nextGreaterElements(vector<int>& nums) {int n = nums.size();        std::stack<int> s;vector<int> ans( n, -1);for (int i = 0; i < 2 * n - 1; ++i) {int idx = i % n;while (!s.empty() && nums[s.top()] < nums[ idx ]) {ans[ s.top() ] = nums[ idx  ];s.pop();}s.push( idx );}return ans;}
};
  • 反向遍歷
class Solution {
public:vector<int> nextGreaterElements(vector<int>& nums) {int n = nums.size();        std::stack<int> s;vector<int> ans( n, -1);for (int i = 2 * n - 1; ~i; --i) {int idx = i % n;while (!s.empty( ) && nums[ s.top()] <= nums[ idx ]) {s.pop();}if (!s.empty() && i < n) {ans[ idx ] = nums[s.top()];}s.push( idx );}return ans;}
};

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

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

相關文章

在postgresql中,group by時取第一個值

在postgresql中,group by時,uuid類型的字段可以用哪個聚集函數: SELECT create_user , (array_agg(myid))[1] AS first_uuid FROM "t_resource_data" GROUP BY create_user 人大金倉、PostgreSQL使用GROUP BY聚合后&#xff0c;取第一個值或最后一個值的辦_pgsql gro…

【FineDance】ModuleNotFoundError: No module named ‘pytorch3d‘

pytorch3d Traceback (most recent call last): File “/home/zhangbin/perfwork/01_ai/13_FineDance/data/code/pre_motion.py”, line 12, in from dataset.quaternion import ax_to_6v, ax_from_6v File “/home/zhangbin/perfwork/01_ai/13_FineDance/dataset/quaternion.…

MySQL 調優筆記

1.如何定位慢查詢? 定位慢查詢主要依靠 MySQL 的慢查詢日志配合工具如 pt-query-digest &#xff0c;mysqldumpslow 進行分析&#xff0c;或者通過 performance_schema 進行實時監控&#xff0c;進一步可以使用 EXPLAIN 分析執行計劃。 -> 開啟慢查詢日志 -- 查看慢查詢…

嵌入式 STM32 開發問題:燒錄 STM32CubeMX 創建的 Keil 程序沒有反應

燒錄 STM32CubeMX 創建的 Keil 程序沒有反應問題原因 大概率是因為沒有勾選 Reset and Run&#xff0c;程序成功燒錄到&#xff0c;但芯片不會自動復位并執行&#xff0c;而是保持停止狀態 處理策略 在 Keil 中勾選 Reset and Run 點擊 【Options for Target】 點擊 【Debu…

Flower框架中noise_multiplier與clipped_count_stddev的關系

noise_multiplier 與 clipped_count_stddev 的數學關系 在差分隱私聯邦學習中&#xff0c;noise_multiplier 和 clipped_count_stddev 是兩個核心參數&#xff0c;它們共同決定了隱私保護強度和模型精度的權衡。理解它們的關系需要從差分隱私的數學原理入手&#xff1a; 1. 高…

Laravel 從版本 5 到 12 每個版本都引入了一些新的特性、改進和棄用的功能

Laravel 從版本 5 到 12 經歷了多次更新,每個版本都引入了一些新的特性、改進和棄用的功能。下面是這些主要版本之間的關鍵區別: Laravel 5 Lumen: 引入了微框架 Lumen。Elixir: Elixir 是一個用于編譯和合并前端資源的工具,后來被 Laravel Mix 取代。Middleware Groups: 引…

Lambda 表達式的語法與使用:更簡潔、更靈活的函數式編程!

全文目錄&#xff1a; 開篇語Lambda 表達式的語法與使用&#xff1a;更簡潔、更靈活的函數式編程一、Lambda 表達式的語法1.1 Lambda 表達式的基本語法形式 二、Lambda 表達式的使用2.1 Lambda 表達式與匿名內部類的對比代碼示例&#xff1a;使用匿名內部類和 Lambda 表達式實現…

從0到1開發一個自己的工具 MCP 并發布到 test PyPi(Python個人版)

目錄 1. 我理解的 MCP2. 寫一個自己的MCP然后發布到 PyPi 上&#xff0c;包括加法工具和獲取當前 ip 工具2.1 先碎碎念一下 uv2.2 初始化項目&#xff08;全程在 cmd 下運行命令&#xff09;2.3 添加 mcp 依賴2.4 添加 server.py&#xff0c;先把加法功能添加上2.5 運行并測試加…

RabbitMQ緩存詳解:由來、發展、核心場景與實戰應用

一、RabbitMQ的由來與發展歷程 1.1 RabbitMQ的誕生背景 RabbitMQ誕生于金融行業的需求,最初由Rabbit Technologies Ltd開發,后被SpringSource收購,最終成為Pivotal的一部分。它的設計初衷是為了解決分布式系統中消息可靠傳輸的問題。在早期金融交易系統中,系統間的通信需…

機器學習與深度學習18-線性代數01

目錄 前文回顧1.特征向量和特征值2.矩陣與模型3.內積和外積4.向量的范數5.正交矩陣 前文回顧 上一篇文章地址&#xff1a;鏈接 1.特征向量和特征值 在機器學習中&#xff0c;特征向量和特征值是用于描述數據集中的特征或變量之間關系的重要概念。它們在降維技術&#xff08;…

如何讓 VS Code 僅通過滾輪放大字體,而不縮放整個界面?

在 VS Code 中&#xff0c;默認情況下使用 Ctrl滾輪&#xff08;Windows/Linux&#xff09;或 Cmd滾輪&#xff08;Mac&#xff09;會同時縮放整個界面&#xff08;包括 UI 元素和編輯器字體&#xff09;。如果你希望僅放大編輯器字體而不影響界面縮放&#xff0c;可以通過以下…

Vue3中v-bind指令用法詳解

在 Vue 3 中&#xff0c;v-bind 是一個核心指令&#xff0c;用于動態綁定 HTML 屬性或組件的 props 到 Vue 實例的數據。以下是詳細講解&#xff1a; 一、基礎用法 1. 綁定單個屬性 vue 復制 下載 <template><!-- 綁定 img 的 src 屬性 --><img v-bind:src…

算法題(169):最大子段和(分治思想)

審題&#xff1a; 本題需要我們找到區間的最大子段和并輸出結果 思路&#xff1a; 方法一&#xff1a;分治思想 我們可以把給定區間平均分成兩部分&#xff0c;然后獲取左段區間的最大子段和&#xff0c;右段區間的最大子段和&#xff0c;以及跨區間的最大子段和。最后比較出他…

Linux 線程深度解析:從內存管理到線程控制的核心機制

文章目錄 引言一、Linux 線程概念1.1 什么是線程1.2 分頁式存儲管理1.2.1 虛擬地址和頁表的由來1.2.2 物理內存管理struct page 的主要用途 1.2.3 頁表1.2.4 頁目錄結構1.2.5 兩級頁表的地址轉換1.2.6 缺頁異常 1.3 線程的優點1.4 線程缺點1.5 線程異常1.6 線程用途 二、Linux進…

玩轉計算機視覺——按照配置部署paddleOCR(英偉達環境與昇騰300IDUO環境)

英偉達環境安裝 創建虛擬環境 conda create -n paddleOCR python3.10 -y conda activate paddleOCRconda install jupyterlab -y conda install ipykernel -y python -m ipykernel install --user --name paddleOCR --display-name "paddle OCR"下載PaddleOCR的GPU…

Java機器學習全攻略:從基礎原理到實戰案例詳解

在當今AI驅動的技術浪潮中,機器學習已成為Java開發者必須掌握的核心技能之一。本文將系統性地介紹Java機器學習的原理基礎、常用框架,并通過多個實戰案例展示如何在實際項目中應用這些技術。無論你是剛接觸機器學習的Java開發者,還是希望鞏固基礎的中級工程師,這篇文章都將…

eBPF 技術詳解及其在網絡安全領域的應用與挑戰

摘要 eBPF&#xff08;extended Berkeley Packet Filter&#xff09;是 Linux 內核中的一項革命性技術&#xff0c;它允許用戶在不修改內核代碼或加載內核模塊的情況下&#xff0c;安全、高效地運行自定義程序。eBPF 的出現極大地擴展了 Linux 內核的可編程性&#xff0c;使其…

error:MISCONF Redis is configured to save RDB snapshots

一、背景 在使用redis異步驅動方式下&#xff0c;執行hset指令時&#xff0c;報錯 redisAsyncCommand((redisAsyncContext *)c, dumpReply, "hset role:10001", "hset role:10001 name %s age %d sex %s", "mark", 31, "male");二、原…

Android-Mod-Menu 使用教程

目錄 簡介前提條件安裝步驟1. 下載和解壓項目2. 配置 Android Studio3. 安裝到設備 修改游戲 APK1. 確定游戲主活動2. 集成模組菜單方法 1&#xff1a;通過服務啟動&#xff08;推薦&#xff09;方法 2&#xff1a;通過活動啟動&#xff08;僅在游戲檢測模組時使用&#xff09;…

SpringBoot 自動化部署實戰:從環境搭建到 CI/CD 全流程

SpringBoot 自動化部署全流程實戰 一、環境準備&#xff08;開發側&#xff09; 基礎工具鏈安裝&#xff1a; # JDK 17 brew install openjdk17 # Maven 構建工具 brew install maven # Docker 環境 brew install --cask docker項目配置驗證&#xff1a; <!-- pom.xml 關…