單調棧 leetcode整理(二)

目錄

  • 為什么單調棧的時間復雜度是O(n)
  • 496. 下一個更大元素 I
    • 方法一:暴力
    • 方法二:單調棧+哈希表
  • 739. 每日溫度
    • 單調棧模版解
    • 優化
  • 503. 下一個更大元素 II
    • 單調棧+循環遍歷

為什么單調棧的時間復雜度是O(n)

盡管for 循環里面還有while 循環,但是里面的while最多執行n次,所以最大執行2n次,即時間復雜度為O(n)。
不能只看有幾層循環,因為很多情況下內循環是不執行的,可以這樣理解,n個元素每個元素最多進棧一次出棧一次,所以是n

496. 下一個更大元素 I

https://leetcode-cn.com/problems/next-greater-element-i/
給定兩個 沒有重復元素 的數組 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每個元素在 nums2 中的下一個比其大的值。

nums1 中數字 x 的下一個更大元素是指 x 在 nums2 中對應位置的右邊的第一個比 x 大的元素。如果不存在,對應位置輸出 -1 。

示例 1:

輸入: nums1 = [4,1,2], nums2 = [1,3,4,2].
輸出: [-1,3,-1]
解釋:
對于num1中的數字4,你無法在第二個數組中找到下一個更大的數字,因此輸出 -1。
對于num1中的數字1,第二個數組中數字1右邊的下一個較大數字是 3。
對于num1中的數字2,第二個數組中沒有下一個更大的數字,因此輸出 -1。

示例 2:

輸入: nums1 = [2,4], nums2 = [1,2,3,4].
輸出: [3,-1]
解釋:
對于 num1 中的數字 2 ,第二個數組中的下一個較大數字是 3 。
對于 num1 中的數字 4 ,第二個數組中沒有下一個更大的數字,因此輸出 -1 。

方法一:暴力

先找到nums1的數在nums2對應的下標,然后從那個下標開始向右遍歷,尋找是否存在。

class Solution {
public:int get_index(vector<int>& nums, int num){for(int i = 0; i < nums.size(); i++){if(num == nums[i]) return i;}return -1;} vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {vector<int> ans(nums1.size());	//答案數組stack<int> st;for(int i = 0; i < nums1.size(); i++){//首先獲取nums1[i](當前元素)在nums2數組中的下標int start = get_index(nums2,nums1[i]);int flag = 0;for(; start < nums2.size(); start++){if(nums2[start] > nums1[i]){ans[i] = nums2[start];flag = 1;break;   }}if(flag == 0){ans[i] = -1;}flag = 0;}return ans;}
};

方法二:單調棧+哈希表

先忽略nums1,因為nums1中元素在nums2中一定有。
對nums2進行單調棧處理,需要記錄的是一個鍵值對(該元素,該元素右邊第一個比該元素大的元素)。
這個是個典型的單調棧模型:
需要注意:在比較的過程,如果滿足st.back() <= nums2[i],就說明nums2[i]是大于棧頂元素的第一個元素(因為我們遍歷是向右遍歷的)。
經過這個過程后,留在棧中的元素都符合沒有找到右邊元素大于該元素的條件,所以應該返回-1。

class Solution {
public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {vector<int> ans(nums1.size());	//答案數組vector<int> st;map<int,int> hash_map;for(int i = 0; i < nums2.size(); i++){while(!st.empty() && st.back() < nums2[i]){//說明第一個大于棧頂元素的元素為nums2[i]hash_map[st.back()] = nums2[i];st.pop_back();}st.push_back(nums2[i]);}//如果此時棧中還有元素,說明說明呢?//說明棧中的元素在nums2數組中沒有在右邊找到比它還大的數,所以需要賦值為-1while(!st.empty()){hash_map[st.back()] = -1;st.pop_back();}//將哈希集合中的鍵值對轉換為結果for(int i = 0; i < nums1.size(); i++){ans[i] = hash_map[nums1[i]];}return ans;}
};

739. 每日溫度

https://leetcode-cn.com/problems/daily-temperatures/
請根據每日 氣溫 列表,重新生成一個列表。對應位置的輸出為:要想觀測到更高的氣溫,至少需要等待的天數。如果氣溫在這之后都不會升高,請在該位置用 0 來代替。

例如,給定一個列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的輸出應該是 [1, 1, 4, 2, 1, 1, 0, 0]。

提示:氣溫 列表長度的范圍是 [1, 30000]。每個氣溫的值的均為華氏度,都是在 [30, 100] 范圍內的整數。

單調棧模版解

一開始我使用了兩個棧,一個用來存該元素,還有一個用來存該元素的下標,用來計算相差天數,時間復雜度會比較高,也浪費了一些空間。后來發現了只使用一個棧,存下標就行了。

class Solution {
public:vector<int> dailyTemperatures(vector<int>& T) {vector<int> ans(T.size());	//答案數組vector<int> st_index;for(int i = 0; i < T.size(); i++){while(!st_index.empty() && T[st_index.back()] < T[i]){//說明第一個大于棧頂元素的元素為nums2[i]ans[st_index.back()] = (i - st_index.back());st_index.pop_back();}st_index.push_back(i);}//說明棧中的元素在nums2數組中沒有在右邊找到比它還大的數,所以需要賦值為-1while(!st_index.empty()){ans[st_index.back()] = 0;st_index.pop_back();}return ans;}
};

優化

這一題還有KMP的解法,等看到KMP的知識點再做!貼個鏈接
https://leetcode-cn.com/problems/daily-temperatures/solution/mei-ri-wen-du-by-leetcode-solution/438101

503. 下一個更大元素 II

https://leetcode-cn.com/problems/next-greater-element-ii/
給定一個循環數組(最后一個元素的下一個元素是數組的第一個元素),輸出每個元素的下一個更大元素。數字 x 的下一個更大的元素是按數組遍歷順序,這個數字之后的第一個比它更大的數,這意味著你應該循環地搜索它的下一個更大的數。如果不存在,則輸出 -1。

示例 1:

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

單調棧+循環遍歷

原本next只能在當前元素的右邊,現在有可能出現在左邊了。
我們可以在原數組后面再接一個原數組,這樣就可以完成這樣的效果。
另外需要注意的是:對于壓棧的元素來說,仍然只是需要壓入前n個數,不需要重復將后面鏈接的數組元素壓入。
還需要注意的是:
1、當前元素大于棧頂元素的時候才能進行出棧操作,也就是說,棧中的元素是嚴格單調遞增的,不允許出現等于的情況(這里可能出現重復的元素,所以不能等于)

class Solution {
public:vector<int> nextGreaterElements(vector<int>& nums) {int n = nums.size();vector<int> ans(n,-1);	//答案數組vector<int> st;for(int i = 0; i < 2 * n; i++){while(!st.empty() && nums[st.back()] < nums[i%n]){ans[st.back()] = nums[i%n];st.pop_back();}if(i < n) st.push_back(i);}return ans;}
};

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

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

相關文章

Android中引入第三方Jar包的方法(java.lang.NoClassDefFoundError解決辦法)

ZZ&#xff1a;http://www.blogjava.net/anchor110/articles/355699.html1、在工程下新建lib文件夾&#xff0c;將需要的第三方包拷貝進來。2、將引用的第三方包&#xff0c;添加進工作的build path。3、&#xff08;關鍵的一步&#xff09;將lib設為源文件夾。如果不設置&…

QTP自傳之web常用對象

隨著科技的進步&#xff0c;“下載-安裝-運行”這經典的三步曲已離我們遠去。web應用的高速發展&#xff0c;改變了我們的思維和生活習慣&#xff0c;同時也使web方面的自動化測試越來越重要。今天&#xff0c;介紹一下我對web對象的識別&#xff0c;為以后的對象庫編程打下基礎…

leetcode中使用c++需要注意的點以及各類容器的初始化、常用成員函數

目錄1、傳引用2、vector使用初始化方法常用成員函數3、字符串string初始化方法常用成員函數4、哈希表 unordered_map初始化常用成員函數示例&#xff1a;計數器5、哈希集合 unordered_set初始化常用成員函數6、隊列 queue初始化成員函數7、棧stack初始化常用成員函數7、emplace…

Linq list 排序,Dictionary 排序

C# 對List成員排序的簡單方法 http://blog.csdn.net/wanzhuan2010/article/details/6205884 LINQ之路系列博客導航 http://www.cnblogs.com/lifepoem/archive/2011/12/16/2288017.html 用一句Linq把一個集合的屬性值根據條件改了&#xff0c;其他值不變 list去重 list.Where((x…

javascript Ajax 同步請求與異步請求的問題

先來看以下代碼&#xff1a; var flagtrue; var index0; $.ajax({url: "http://www.baidu.com/",success: function(data){flagfalse;} }); while(flag){index; } alert(index); 請問最后alert的index的結果是多少&#xff1f; 可能有人會說0唄。實際上卻沒那么簡單…

定義類的Python示例

The task to define a class in Python. 在Python中定義類的任務。 Here, we are defining a class named Number with an attribute num, initializing it with a value 123, then creating two objects N1 and N2 and finally, printing the objects memory locations and a…

十一、線性層

一、Linear Layers torch.nn.Linear(in_features, out_features, biasTrue, deviceNone, dtypeNone) 以VGG神經網絡為例&#xff0c;Linear Layers可以將特征圖的大小進行變換由(1,1,4096)轉換為(1,1,1000) 二、torch.nn.Linear實戰 將CIFAR-10數據集中的測試集二維圖像[6…

easyui plugin——etreegrid:CRUD Treegrid

昨天寫了一個koeasyui的同樣的實現&#xff0c;感覺寫的太亂&#xff0c;用起來十分麻煩&#xff0c;于是今天照著edatagrid&#xff0c;寫了一個etreegrid&#xff0c;這樣再用ko綁定就方便多了。 使用很簡單,$(tableId).etreegrid({idField:parentIdField:,treeField:,saveUr…

expr

expr在linux中 是一個功能非常強大的命令。通過學習做一個小小的總結。 1、計算字符串的長度。我們可以用awk中的length(s)進行計算。我們 也可以用echo中的echo ${#string}進行計算&#xff0c;當然也可以expr中的expr length $string 求出字符串的長度。舉 例[rootlocalhost …

leetcode 42. 接雨水 思考分析(暴力、動態規劃、雙指針、單調棧)

目錄題目思路暴力法動態規劃雙指針法單調棧題目 給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖&#xff0c;計算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 輸入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 輸出&#xff1a;6 解釋&#xff1a;上面是由數組…

chdir函數_PHP chdir()函數與示例

chdir函數PHP chdir()函數 (PHP chdir() function) The full form of chdir is "Change Directory", the function chdir() is used to change the current working directory. chdir的完整形式是“更改目錄” &#xff0c; 功能chdir()用于更改當前工作目錄。 Synt…

十二、Sequential

一、Sequential介紹 torch.nn.Sequential(*args) 由官網給的Example可以大概了解到Sequential是將多層網絡進行便捷整合&#xff0c;方便可視化以及簡化網絡復雜性 二、復現網絡模型訓練CIFAR-10數據集 這里面有個Hidden units隱藏單元其實就是連個線性層 把隱藏層全部展開整…

1064-快速排序

描述 給定輸入排序元素數目n和相應的n個元素&#xff0c;寫出程序&#xff0c;利用內排序算法中快速排序算法進行排序&#xff0c;并輸出排序最后結果的相應序列。 輸入 共兩行&#xff0c;第一行給出排序元素數目n&#xff0c;第二行給出n個元素&#xff0c;1≤n≤100000&…

社交問答:取代BBS的Web2.0革命

編者按&#xff1a;本文由樂維UP創始人俞越撰寫&#xff0c;你也可以點擊這里關注俞越的新浪微博。 BBS在中國的興起是在95年&#xff0c;之后以驚人的速度發展起來。從2011年開始&#xff0c;國內的問答社區也如當年的BBS一樣&#xff0c;大量涌現快速成長&#xff0c;大體分為…

單調棧 leetcode整理(三)

目錄42. 接雨水思路分析901. 股票價格跨度思路581. 最短無序連續子數組思路一&#xff1a;排序雙指針思路二&#xff1a;單調棧思路三&#xff1a;雙指針(最省時)42. 接雨水 42. 接雨水 給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖&#xff0c;計算按此排列的柱子&…

python 摳圖 鋸齒_Python | 繪圖中的抗鋸齒

python 摳圖 鋸齒Antialiasing is another important feature of Matplotlib and in this article, we will review how to use this functionality. pyplot.antialiased() is an inbuilt function in matplotlib.pyplot which performs our required operation. 抗鋸齒是Matpl…

apk 反編譯

引用&#xff1a;http://code.google.com/p/dex2jar/issues/detail?id20 最新版:dex2jar http://code.google.com/p/dex2jar/downloads/list 錯誤&#xff1a;http://code.google.com/p/dex2jar/issues/detail?id20 這段時間在學Android應用開發&#xff0c;在想既然是用Jav…

OpenDiscussion_DataDrivenDesign

本文源于公司內部技術交流&#xff0c;如有不當之處&#xff0c;還請指正。 Content&#xff1a; 1. What is Data-driven design?2. WPF revolution.3. More about ObservableCollection.4. Question.1. What is Data-driven design?Data-driven design: is a design of usi…

十三、Loss Functions

一、Loss Functions損失函數 損失函數的作用&#xff1a; 1&#xff0c;損失函數就是實際輸出值和目標值之間的差 2&#xff0c;由這個差便可以通過反向傳播對之后的數據進行更新 Loss Functions官網給的API 里面由很多種損失函數&#xff0c;不同的損失函數有其不同的用途及表…

leetcode 滑動窗口小結 (一)

目錄小結以及代碼框架76. 最小覆蓋子串滑動窗口代碼以及注釋567. 字符串的排列滑動窗口438. 找到字符串中所有字母異位詞3. 無重復字符的最長子串化簡框架reference小結以及代碼框架 滑動窗口技巧屬于雙指針技巧。 該算法的思路為維護一個窗口&#xff0c;不斷滑動&#xff0c…