題目
根據每日 氣溫 列表,請重新生成乙個列表,對應位置的輸出是需要再等待多久溫度才會公升高超過該日的天數。如果之後都不會公升高,請在該位置用 0 來代替。
例如,給定乙個列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的輸出應該是 [1, 1, 4, 2, 1, 1, 0, 0]。
思路
理解題目以後,直接想到的思路就是 逐個遍歷,然後對每個元素 向後遍歷尋找比他大的元素,下標差 則是解,**見1笨方法。
這種每個都去遍歷的場景,很容易出現重複計算,由於是向右邊找,如果想利用前面的計算成果,當然是從右邊開始遍歷啦。當右邊的res陣列已經計算完畢以後,如果你對i這個下標進行查詢,
(1)發現 i+1符合要求,而i+1已經計算過了,則可以直接跨res[i+1] 個下標,繼續匹配大小。就節省了重複的遍歷,提高效率。
(2)如果你發現i+1不符合要求,並且 res[i+1]是0 ,請立馬結束遍歷,res[i] 必須是0(這個也是重點)。
**見2.笨方法的優化
也可以使用棧來實現這個功能,如果你儲存元素的值的話,當出棧以後。你不知道他下標是啥,就無法 對res賦值。所以更機智的辦法就是直接在棧裡儲存下標,反正有陣列。下標就能代表整個元素,完美! 由於是要 尋找比他大的元素,so,
(1)當遍歷到的元素,比棧頂元素 大的時候,妥妥的出棧,然後求個下標差就好了嘛。不過這是其中一種場景
(2)如果遍歷到的元素比棧頂小,就要先入棧,猥瑣發育,別浪,(當然棧裡面元素目前是單調遞減哦)當遇到比棧頂大的以後,棧頂出棧!計算下標差,放入res陣列。然後新棧頂來到pk台上,若遍歷到的元素繼續衛冕冠軍,新棧頂出棧!直到棧內 沒有元素了 或者 棧裡元素更大,那衛冕冠軍的下標就入棧咯。所以 for迴圈裡面對棧的操作要是個while迴圈,(當棧內有元素並且棧頂元素比 目前遍歷的元素小,要一直不停的比較,出棧)結束以後,當前遍歷的元素下標入棧就好了嘛。結束!
1.笨方法
public
int[
]getres
(int
t)}}
return res;
}
2.笨辦法的優化
public
int[
]getres
(int
t)else
if(res[j]==0
)}}return res;
}
3.單調棧 (知識點)
public
int[
]getres
(int
t)stack.
push
(t[i]);
}return res;
}
leetcode 每日溫度(單調棧)
類似於 柱狀圖中最大的矩形 單調棧 請根據每日 氣溫 列表,重新生成乙個列表。對應位置的輸出為 要想觀測到更高的氣溫,至少需要等待的天數。如果氣溫在這之後都不會公升高,請在該位置用 0 來代替。例如,給定乙個列表 temperatures 73,74,75,71,69,72,76,73 你的輸出應該...
739 每日溫度 單調棧
739.每日溫度 o n 2 o n 2 o n2 class solution else res i tmp return res o n o n o n class solution stack.push i return res 單調棧 monotone stack 是指棧內元素 棧底到棧頂 ...
單調棧 739 每日溫度
請根據每日 氣溫 列表,重新生成乙個列表。對應位置的輸出為 要想觀測到更高的氣溫,至少需要等待的天數。如果氣溫在這之後都不會公升高,請在該位置用 0 來代替。例如,給定乙個列表 temperatures 73,74,75,71,69,72,76,73 你的輸出應該是 1,1,4,2,1,1,0,0 ...