思考:可以将题目转化为找当前数字向右查找的第一个大于的数字之间有多少个数字
BF求解:时间复杂度O(n^2)
优化思路:维持一个单调递增栈(记录索引)来模拟此过程,将时间复杂度下降至O(n)
单调递增栈/单调递减栈:栈顶到栈底递增/递减
单调栈思想:遍历数组,当遇到比栈顶元素大的元素时说明遇到第一个大于栈顶元素的数字,栈顶元素弹出,同时记录索引之差为中间有多少个数字
过程示意图举例:
C++代码示例:
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
vector<int> result(temperatures.size(), 0);
vector<int> stack;
stack.push_back(0);
for(int i = 1; i < temperatures.size(); ++i)
{
if(temperatures[i] <= temperatures[stack.back()]){
stack.push_back(i);
//cout << "push back" << temperatures[i] <<endl;
}
else{
while(!stack.empty() && temperatures[i] > temperatures[stack.back()]){
int top = stack.back();
//cout << "pop out" << top <<endl;
stack.pop_back();
result[top] = i - top;
}
stack.push_back(i);
//cout << "push back" << temperatures[i] <<endl;
}
}
return result;
}
};