题目

分析
个人认为比较巧妙的是将原数组复制两遍来模拟循环,就不用其他复杂的结构了。不过入栈时只需要前n个即可,后面n个是来给前n找是否有更大的,它们自身不需要再找更大。
代码
cpp
class Solution {
struct num {
int val;
int pos;
};
public:
vector<int> nextGreaterElements(vector<int>& nums) {
int n = nums.size();
if (n == 0) return {};
// 构造双倍长度数组
vector<int> myNums = nums;
myNums.insert(myNums.end(), nums.begin(), nums.end());
vector<int> res(n, -1);
stack<num> myStack;
for (int i = 0; i < 2 * n; i++) {
int realPos = i % n;
while (!myStack.empty() && myNums[i] > myStack.top().val) {
res[myStack.top().pos] = myNums[i];
myStack.pop();
}
// 只需要把前 n 个位置入栈(避免重复入栈)
if (i < n) {
myStack.push({myNums[i], realPos});
}
}
return res;
}
};
结果
