Day50:單調棧 LeedCode 739. 每日溫度 496.下一個更大元素 I 503. 下一個更大元素 II

739. 每日溫度

給定一個整數數組?temperatures?,表示每天的溫度,返回一個數組?answer?,其中?answer[i]?是指對于第?i?天,下一個更高溫度出現在幾天后。如果氣溫在這之后都不會升高,請在該位置用?0?來代替。

示例 1:

輸入: temperatures = [73,74,75,71,69,72,76,73]
輸出:?[1,1,4,2,1,1,0,0]

示例 2:

輸入: temperatures = [30,40,50,60]
輸出:?[1,1,1,0]

示例 3:

輸入: temperatures = [30,60,90]
輸出: [1,1,0]

提示:

  • 1 <=?temperatures.length <= 105
  • 30 <=?temperatures[i]?<= 100

思路:

首先想到的當然是暴力解法,兩層for循環,時間復雜度是O(n^2)

單調棧的解法:時間復雜度為O(n)

什么時候用單調棧呢?

通常是一維數組,要尋找任一個元素的右邊或者左邊第一個比自己大或者小的元素的位置,此時我們就要想到可以用單調棧了。時間復雜度為O(n)。

單調棧的本質是空間換時間

首先要明確如下幾點:

1.單調棧里存放的元素是什么?

單調棧里只需要存放元素的下標i就可以了,如果需要使用對應的元素,直接T[i]就可以獲取。

2.單調棧里元素是遞增呢? 還是遞減呢?

使用遞增循序(再強調一下是指從棧頭到棧底的順序)

圖解:

class Solution {public int[] dailyTemperatures(int[] temperatures) {int[] result=new int[temperatures.length];List<Integer> list=new LinkedList<>();for(int i=0;i<temperatures.length;i++){while(list.size()>0&&temperatures[list.get(list.size()-1)]<temperatures[i]){int index=list.get(list.size()-1);result[index]=i-index;list.remove(list.size()-1);}list.add(i);}return result;}
}

496. 下一個更大元素 I

nums1?中數字?x?的?下一個更大元素?是指?x?在?nums2?中對應位置?右側?的?第一個?比?x?大的元素。

給你兩個?沒有重復元素?的數組?nums1?和?nums2?,下標從?0?開始計數,其中nums1?是?nums2?的子集。

對于每個?0 <= i < nums1.length?,找出滿足?nums1[i] == nums2[j]?的下標?j?,并且在?nums2?確定?nums2[j]?的?下一個更大元素?。如果不存在下一個更大元素,那么本次查詢的答案是?-1?。

返回一個長度為?nums1.length?的數組?ans?作為答案,滿足?ans[i]?是如上所述的?下一個更大元素?。

示例 1:

輸入:nums1 = [4,1,2], nums2 = [1,3,4,2].
輸出:[-1,3,-1]
解釋:nums1 中每個值的下一個更大元素如下所述:
- 4 ,用加粗斜體標識,nums2 = [1,3,4,2]。不存在下一個更大元素,所以答案是 -1 。
- 1 ,用加粗斜體標識,nums2 = [1,3,4,2]。下一個更大元素是 3 。
- 2 ,用加粗斜體標識,nums2 = [1,3,4,2]。不存在下一個更大元素,所以答案是 -1 。

示例 2:

輸入:nums1 = [2,4], nums2 = [1,2,3,4].
輸出:[3,-1]
解釋:nums1 中每個值的下一個更大元素如下所述:
- 2 ,用加粗斜體標識,nums2 = [1,2,3,4]。下一個更大元素是 3 。
- 4 ,用加粗斜體標識,nums2 = [1,2,3,4]。不存在下一個更大元素,所以答案是 -1 。

提示:

  • 1 <= nums1.length <= nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 104
  • nums1nums2中所有整數?互不相同
  • nums1?中的所有整數同樣出現在?nums2?中

進階:你可以設計一個時間復雜度為?O(nums1.length + nums2.length)?的解決方案嗎?

思路:本題與上題思路一致,只是不是求nums2中所有數的下一個更大書,而是求其子集nums1中每個數的在nums2中的下一個更大數,所以我們要將nums1的值和坐標存下來

此外,本題求下一個更大數,不是求坐標,所以單調棧中存放數而不是坐標了

 class Solution {public int[] nextGreaterElement(int[] nums1, int[] nums2) {Map<Integer, Integer> map = new HashMap<>();for (int i = 0; i < nums1.length; i++) {map.put(nums1[i], i);//記錄下nums1中的數據以及它們對應的下標}int result[] = new int[nums1.length];//初始化Arrays.fill(result, -1);//單調棧List<Integer> list = new LinkedList<>();for (int i = 0; i < nums2.length; i++) {//當棧不為空,且nums2[i]>棧頂元素時,找到了棧頂元素的下一個更大值了while (list.size() > 0 && nums2[i] > list.get(list.size() - 1)) {//如果棧頂元素是nums1中的元素if (map.containsKey(list.get(list.size() - 1))) {//記錄下這個更大值//求棧頂元素int num = list.get(list.size() - 1);//求棧頂元素在nums1中的位置,和記錄結果result[map.get(num)] = nums2[i];}list.remove(list.size() - 1);}list.add(nums2[i]);}return result;}
}

503. 下一個更大元素 II

給定一個循環數組?nums?(?nums[nums.length - 1]?的下一個元素是?nums[0]?),返回?nums?中每個元素的?下一個更大元素?。

數字?x?的?下一個更大的元素?是按數組遍歷順序,這個數字之后的第一個比它更大的數,這意味著你應該循環地搜索它的下一個更大的數。如果不存在,則輸出?-1?。

示例 1:

輸入: nums = [1,2,1]
輸出: [2,-1,2]
解釋: 第一個 1 的下一個更大的數是 2;
數字 2 找不到下一個更大的數; 
第二個 1 的下一個最大的數需要循環搜索,結果也是 2。

示例 2:

輸入: nums = [1,2,3,4,3]
輸出: [2,3,4,-1,4]

提示:

  • 1 <= nums.length <= 104
  • -109?<= nums[i] <= 109

思路:本題與上題類似,可以將兩個nums拼起來,然后利用單調棧求出每個數的下一個更大的數

class Solution {public int[] nextGreaterElements(int[] nums) {int[] result=new int[nums.length];List<Integer>list=new LinkedList<>();Arrays.fill(result,-1);for(int i=0;i<2*nums.length;i++){while(list.size()>0&&nums[i%nums.length]>nums[list.get(list.size()-1)]){int index=list.get(list.size()-1);result[index]=nums[i%nums.length];list.removeLast();}list.add(i%nums.length);}return result;}
}

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

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

相關文章

【蓄勢·致遠】 同為科技(TOWE)2024年年中會議

2024年7月2日-8日&#xff0c;同為科技&#xff08;TOWE&#xff09;召開2024年年中工作會議。會議回顧上半年總體工作情況&#xff0c;分析研判發展形勢&#xff0c;規劃部署下半年工作。 為期一周的工作會議&#xff0c;由同為科技&#xff08;TOWE&#xff09;創始人、董事長…

futures.toArray(new CompletableFuture[0])

futures.toArray(new CompletableFuture[0]) 是一種常見的將 List 轉換為數組的方式&#xff0c;特別是在需要將 List 傳遞給接受數組參數的方法時。讓我們詳細解釋一下這段代碼的具體含義和工作原理。 代碼解釋 假設 futures 是一個 List<CompletableFuture<Map<St…

【人臉識別、Python實現】PyQt5人臉識別管理系統

PyQt5人臉識別管理系統 項目描述主要功能效果展示獲取源碼 項目描述 接的一個基于宿舍管理系統與人臉識別的小單子。然后我把它優化了一些&#xff0c;現在開源一下。有需要的小伙伴自取&#xff0c;點個免費的關注就行 主要功能 1、錄入學生基本信息、錄入人臉 2、主頁面展…

【Django】Django 使用連接串配置數據庫

Django 使用連接串配置數據庫 Django 配置數據庫 修改 settings.py 中 DATABASES&#xff0c;這里以 mysql 數據庫為例。 DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: your_database_name,USER: your_database_user,PASSWORD: your_database_password,HO…

深度|不同數據系統中的“一致性”(Consistency)含義的區別

“你們的系統能實現強一致性嗎&#xff1f;”作為過去幾年一直在開發流處理系統的從業者&#xff0c;我經常被問到這個問題。我時常想自信地推銷我們的產品&#xff0c;但現實情況是&#xff0c;回答這個問題并不簡單。其中的挑戰并不在于問題本身&#xff0c;而在于 “一致性”…

字節8年經驗之談!好用移動APP自動化測試框架有哪些?

移動App自動化測試框架是為了提高測試效率、降低測試成本而開發的一套工具和方法。好用的移動App自動化測試框架有很多&#xff0c;下面將介紹一些常用的框架&#xff0c;并提供一篇超詳細和規范的文章&#xff0c;從零開始幫助你搭建一個移動App自動化測試框架。 1. Appium&a…

筆記:在Entity Framework Core中使用DeleteBehavior配置外鍵級聯刪除

一、目的&#xff1a; 在Entity Framework Core中&#xff0c;DeleteBehavior枚舉定義了在刪除主實體時如何處理與之關聯的外鍵約束。DeleteBehavior.Cascade是DeleteBehavior枚舉的一個選項&#xff0c;它指定當刪除主實體時&#xff0c;所有具有外鍵引用的相關實體也將被自動…

十大優秀AI人工智能作詞軟件有哪些?

1、妙筆生詞&#xff1a;國內專業智能作詞工具&#xff0c;是一款非常優秀的國內作詞軟件&#xff0c;它可以選擇語言&#xff0c;風格&#xff0c;韻腳一鍵生成歌詞&#xff0c;也可以仿寫歌詞&#xff0c;可以續寫歌詞&#xff0c;可以智能取歌名&#xff0c;找優秀詞句&…

神經網絡識別數字圖像案例

學習資料&#xff1a;從零設計并訓練一個神經網絡&#xff0c;你就能真正理解它了_嗶哩嗶哩_bilibili 這個視頻講得相當清楚。本文是學習筆記&#xff0c;不是原創&#xff0c;圖都是從視頻上截圖的。 1. 神經網絡 2. 案例說明 具體來說&#xff0c;設計一個三層的神經網絡。…

如何找工作 校招 | 社招 | 秋招 | 春招 | 提前批

馬上又秋招了&#xff0c;作者想起以前讀書的時候&#xff0c;秋招踩了很多坑&#xff0c;但是第一份工作其實挺重要的。這里寫一篇文章&#xff0c;分享一些校招社招的心得。 現在大學的情況是&#xff0c;管就業的人&#xff0c;大都是沒有就業的輔導員&#xff08;筆者見過…

億發512版本更新,看數據駕駛艙、掃碼揀貨、UDI序列號的新功能

如果您正尋求突破傳統業務模式的束縛&#xff0c;希望擁抱數字化轉型帶來的無限可能&#xff0c;我們誠邀您體驗億發軟件。億發專業團隊將為您提供個性化的咨詢和定制服務&#xff0c;幫助您的企業快速適應市場變化&#xff0c;實現業務模式和商業模式的創新。

【騰訊云生成式AI產品解決方案深度分析 2024】

文末有福利&#xff01; 騰訊云生成式AI產品解決方案 (一) 基于生成式AI的騰訊云產品架構升級 (二) 騰訊云完善的產品矩陣&#xff0c;滿足不同路線客戶需求 1. 路線一 標準軟件 (1) 騰訊樂享AI助手 落地背景及挑戰在企業知識管理、培訓學習、辦公協同場景中&#xff0c;存…

初識C++ | 基本介紹、命名空間、輸入輸出、缺省函數、函數重載、引用、內聯函數、nullptr

基本介紹 C的起源 1979年&#xff0c;當時的 Bjarne Stroustrup 正在?爾實驗室從事計算機科學和軟件?程的研究?作。?對項?中復雜的軟件開 發任務&#xff0c;特別是模擬和操作系統的開發?作&#xff0c;他感受到了現有語?&#xff08;如C語?&#xff09;在表達能?、可…

無法定位程序輸入點kernel32.dll ——一鍵修復丟失kernel32.dll方案

無法定位程序輸入點" 錯誤通常發生在 Windows 操作系統中&#xff0c;當一個程序試圖加載一個 DLL&#xff08;動態鏈接庫&#xff09;文件中的特定函數&#xff0c;但無法找到該函數的入口點時。kernel32.dll 是 Windows 操作系統中的一個關鍵 DLL 文件&#xff0c;它包含…

Backyard二指夾爪硬件安裝與軟件配置

一、背景 每次要用機械臂做實驗時&#xff0c;都要重新配置好一會&#xff0c;尤其這個Backyard二指夾爪&#xff0c;各種連接線和外接電源。雖然很麻煩&#xff0c;但理清思路后&#xff0c;10分鐘就可以搞定。所以說腦力勞動的效率永遠大于體力勞動&#xff0c;要多想&#…

HiFi音頻pro和普通HiFi音頻

針對那些對音質要求極高、追求專業級音頻表現的用戶&#xff0c;音頻設備公司專門設計了HiFi 音頻Pro系列。它們在設計和性能上更為精細和高級&#xff0c;當然價格通常也會反映其高端定位和專業水準。相比之下&#xff0c;普通HiFi音頻設備雖然也能提供良好的音質&#xff0c;…

設置DepthBufferBits和設置DepthStencilFormat的區別

1&#xff09;設置DepthBufferBits和設置DepthStencilFormat的區別 2&#xff09;Unity打包exe后&#xff0c;游戲內拉不起Steam的內購 3&#xff09;Unity 2022以上Profiler.FlushMemoryCounters耗時要怎么關掉 4&#xff09;用GoodSky資產包如何實現晝夜播發不同音樂功能 這是…

【北京迅為】《i.MX8MM嵌入式Linux開發指南》-第一篇 嵌入式Linux入門篇-第十八章 Linux編寫第一個自己的命令

i.MX8MM處理器采用了先進的14LPCFinFET工藝&#xff0c;提供更快的速度和更高的電源效率;四核Cortex-A53&#xff0c;單核Cortex-M4&#xff0c;多達五個內核 &#xff0c;主頻高達1.8GHz&#xff0c;2G DDR4內存、8G EMMC存儲。千兆工業級以太網、MIPI-DSI、USB HOST、WIFI/BT…

Python-找客戶軟件

軟件功能 請求代碼&#xff1a; 填充表格&#xff1a; 可以search全國各個區縣的所有企業信息&#xff0c;過濾手機號、查看是否續存/在業狀態。方便找客戶。 支持定-制-其他引-留-阮*件&#xff08;XHSS&#xff0c;DYY&#xff0c;KS&#xff0c;Bi-li*Bi-li&#xff09; V*…

AutoHotKey自動熱鍵(八)腳本快速暫停與重新加載

我們在編輯腳本的時候,可以添加快捷鍵來改變腳本的狀態 ;暫停腳本 F11::Suspend;重置腳本 F12::Reloadreload用來重置腳本 我們可以在腳本開頭加上標簽提示腳本重啟成功 ToolTip, 腳本已經重啟 Sleep, 1000 ToolTip第二個ToolTip是用來關閉提示器用的 這個提示功能一定要寫…