总时间限制: 2000ms 单个测试点时间限制: 200ms 内存限制: 262144kB 描述 给定一个大小为n的循环数组nums(下标0到n-1,nums[n-1]的下一个元素是nums[0]),返回nums中每个元素的下一个更大元素的值。 数字nums[i]的下一个更大元素是按数组遍历顺序,这个数字之后的第一个比它更大的数。循环数组意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1 。 输入 第一行一个整数n(1<=n<=200000),表示循环数组元素个数。 第二行n个数,分别表示nums[0]...nums[n-1]。 (-10^9<=nums[i]<=10^9) 输出 n个数,表示每个位置的下一个更大元素。
时间: 2024-02-11 14:08:28 浏览: 148
该问题可以使用单调栈来解决。我们可以使用一个栈来存储尚未找到下一个更大元素的索引。在遍历数组时,对于每个元素,我们将其索引入栈。如果栈顶元素所对应的元素比当前元素小,那么栈顶元素所对应的下一个更大元素就是当前元素,我们可以将栈顶元素出栈,并将其所对应的下一个更大元素设置为当前元素。我们可以将数组扩展一倍,将其变成一个普通的数组,这样就不需要考虑循环数组的问题了。最后,我们可以将数组的后半部分(即原数组的部分)中没有找到下一个更大元素的元素,其对应的下一个更大元素都设置为 -1。
以下是该问题的C++代码实现:
```cpp
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
vector<int> nextGreaterElements(vector<int>& nums) {
int n = nums.size();
vector<int> res(n, -1); // 初始化为-1
stack<int> st; // 存储尚未找到下一个更大元素的索引
for (int i = 0; i < n * 2; i++) { // 扩展数组为普通数组
int num = nums[i % n];
while (!st.empty() && nums[st.top()] < num) { // 栈顶元素所对应的下一个更大元素是当前元素
res[st.top()] = num;
st.pop();
}
if (i < n) st.push(i); // 只将前半部分的元素入栈
}
return res;
}
int main() {
int n;
cin >> n;
vector<int> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
vector<int> res = nextGreaterElements(nums);
for (int i = 0; i < n; i++) {
cout << res[i] << " ";
}
cout << endl;
return 0;
}
```
阅读全文