leetcode 503. 下一个更大元素 II medium
题目描述:
解题思路:
方法一:
循环数组 : 我们可以把这个循环数组「拉直」,即复制该序列的前 n-1n−1 个元素拼接在原序列的后面。 这样循环数组就变成了普通数组, 所以我们就可以用单调栈, 求右边第一个比它大的。
方法二:
还是用单调栈,但是这次不用从右向左那个模板,而是从左向右求右边第一个比它大的。
代码:
// 方法一
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
vector<int> tmp(nums);
// 数组拉长
for (int i = 0; i < nums.size() - 1; i++)
tmp.push_back(nums[i]);
vector<int> res(tmp.size());
stack<int> stk;
// 从右向左遍历
for (int i = tmp.size() -1; i>=0; i--)
{
while (stk.size() && tmp[stk.top()] <= tmp[i])
stk.pop();
res[i] = stk.empty()?-1:tmp[stk.top()];
stk.push(i);
}
return vector<int>(res.begin(), res.begin() + nums.size());
}
};
// 方法二
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
int n = nums.size();
vector<int> res(n, -1);
stack<int> stk;
for (int i = 0; i < 2*n-1; i++)
{
while(stk.size() && nums[stk.top()] < nums[i%n]){
res[stk.top()] = nums[i%n];
stk.pop();
}
stk.push(i%n);
}
return res;
}
};