思路:
与之前 739、1475 单调栈的问题如出一辙,唯一不同的地方就是对于遍历完之后。栈中元素的处理,之前的栈中元素因无法找到符合条件的值,直接加入vector中。而这里需要再重头遍历一下数组,找是否有符合条件的,如果仍然找不到的话,才会把它赋值然后加入vector中。
代码:
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
int n = nums.size();
vector<int> ans(n);
stack<int> st;
for (int i = 0; i < n; i++) {
int t = nums[i];
// 出栈并计算
while (!st.empty() && t > nums[st.top()]) {
int x = st.top();
ans[x] = t;
st.pop();
}
// 入栈
while (st.empty() || (t <= nums[st.top()] && i != st.top())) {
st.push(i);
}
}
// 处理遍历完之后,栈中剩余的元素。
while (!st.empty()) {
int x = st.top();
// 从头遍历数组看是否有符合要求的值。
int i = 0;
for (i = 0; i < n; i++) {
if (nums[i] > nums[x]) {
ans[x] = nums[i];
break;
}
}
if (i == n) ans[x] = -1;
st.pop();
}
return ans;
}
};
注意点:
for循环中的入栈出栈顺序非常重要!!!
出栈放在最后,则新元素无法入栈。
运行结果: