题目描述
算法
(单调栈)
- 从后往前,维护一个单调严格递减的栈,如果nums[i]大于等于栈顶元素,则不断出栈,直到不满足要求
- 然后让nums[i]等于栈顶元素(表示下一个比它更大的数),如果栈为空,就让nums[i] = -1
- 因为是循环数组,所以我们要copy一份nums
时间复杂度是 :遍历一次数组,空间复杂度是 :栈空间q[N]需要
代码
class Solution {
public:
static const int N = 1e4 + 7;
int q[N];
int hh = 0, tt = 0;
vector<int> nextGreaterElements(vector<int>& nums) {
int n = nums.size();
// Because circulation, we need double nums
nums.insert(nums.end(), nums.begin(), nums.end());
// Monotonous stack
for (int i = 2 * n - 1; i >= 0; i --) {
while(hh < tt && nums[i] >= q[tt - 1]) tt --;
int tmp = nums[i];
if (hh < tt) nums[i] = q[tt - 1]; // next great element
else nums[i] = -1; // not exist
q[tt ++] = tmp;
}
nums.erase(nums.begin() + n, nums.end());
return nums;
}
};