单调栈:
分解题目意思,其实就是查找当前数字之后的第一个比自己大的数字的差值,如果没有则为0,
暴力法可以一一向后遍历,其实我们可以像数组反向遍历,将数字入栈,
始终保持栈顶元素比当前准备入栈元素大,否则出栈,并给当前元素记录差值
C++:
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& T) {
stack<pair<int, int>> s;
vector<int> ret;
for (int i = T.size() - 1; i >=0; --i) {
int cnt = 1;
while (!s.empty() && s.top().first <= T[i]) {
cnt += s.top().second;
s.pop();
}
if (s.empty()) {
ret.push_back(0);
s.push({T[i], 1});
}
else {
ret.push_back(cnt);
s.push({T[i], cnt});
}
}
return {ret.rbegin(), ret.rend()};
}
};
Go:
type pair struct {
first int
second int
}
func reverse(s []int) []int {
for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
s[i], s[j] = s[j], s[i]
}
return s
}
func dailyTemperatures(T []int) []int {
var stack []pair
var res []int
for i := len(T) - 1; i >=0; i-- {
cnt := 1
for ;len(stack) != 0 && stack[len(stack) - 1].first <= T[i]; {
cnt += stack[len(stack) - 1].second
stack = stack[:len(stack) - 1]
}
if len(stack) == 0 {
res = append(res, 0)
var p pair
p.first = T[i]
p.second = 0
stack = append(stack, p)
} else {
res = append(res, cnt)
var p pair
p.first = T[i]
p.second = cnt
stack = append(stack, p)
}
}
return reverse(res)
}