
解题思路
本题的解题思路其实是需要用到单调栈。
本题中用到的是单调递减栈,那我们如何来进行使用呢?
以所给示例进行分析:
temperatures = [73, 74, 75, 71, 69, 72, 76, 73],输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]
首先构造一个空栈(切记栈中存储的是数组元素的下标)
遍历temperatures数组,将第一个数73的下标置于栈顶,而后比较temperatures数组中每一个元素与栈顶元素的大小,
倘若当前数组元素的大小是大于当前栈顶元素的话,则不入栈,因为此时不符合递减栈的要求,需要弹出栈顶元素,直到当前数组元素是小于栈顶元素,满足单调栈的条件,此时求出相应的下标差就是对应的距离。
举例如下:
设栈为st
1.st为空,遍历temperatures数组,将数组的第一个元素的下标压入堆栈,记st[0] = 0;
此时的堆栈:0
2.i=1,取temperatures[1]=74,74>73,此时若是压入栈则不满单调栈的条件,因此弹出栈顶元素,计算二者的下标差就是题中所求。所以res[0] = 1 - 0 = 1;而后把当前数组元素的下标压入栈中。
此时的堆栈:1
3.i=2,取temperatures[2]=75,75>74,与2一致,弹出栈顶元素,将当前数组元素下标存入堆栈中,因此res[1] = 2 - 1 = 1;
此时的堆栈:2
4.i=3,取temperatures[3]=71,71<75,当前数组元素大小小于栈顶元素,满足单调递减栈,存入堆栈,此时栈顶元素是3;
此时的堆栈:2 3
5.i=4,取temperatures[4]=69,69<71,与4一致,此时栈顶元素是4;
此时的堆栈:2 3 4
6.i=5,取temperatures[5]=72,72>69,与2一致,弹出当前栈顶元素,记录res[4] = 5 - 4 = 1;
继续比较72 > 71,与上述一致,res[3] = 5 - 3 = 2;
继续比较,72 <75,满足单调递减栈,压入堆栈,栈顶元素是5;
此时的堆栈:2 5
7.i=6,取temperatures[6]=76,76>72,弹出栈顶元素,res[5] = 6 - 5 = 1;
继续比较76>75,弹出栈顶元素,res[2] = 6 - 2 = 4;
将76存入堆栈,栈顶元素是6;
此时的堆栈:6
8.i=7,取temperatures[7]=73,73<76,满足单调栈,更新栈顶元素,为7。
此时的堆栈:6 7
遍历结束。
以上便是总体流程。
代码
C++
cpp
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
int n = temperatures.size();
vector<int> result(n,0);
stack<int> st;
for(int i=0; i<n; i++)
{
while(!st.empty() && temperatures[i] > temperatures[st.top()])
{
auto t = st.top();
st.pop();
result[t] = i - t;
}
st.push(i);
}
return result;
}
};
python
python
class Solution(object):
def dailyTemperatures(self, temperatures):
"""
:type temperatures: List[int]
:rtype: List[int]
"""
length = len(temperatures)
stack = []
res = [0]*length
for i in range(length):
while stack and temperatures[i] > temperatures[stack[-1]]:
t = stack.pop()
res[t] = i - t
stack.append(i)
return res