假设我们有一个圆形数组(最后一个元素的下一个元素是数组的第一个元素),我们必须为每个元素显示下一个更大的数字。在这里,数字x的下一个更大的数字是数组中其遍历顺序中第一个更大的数字,这意味着我们可以循环搜索以找到其下一个更大的数字。如果不存在,则为-1。因此,如果数字为[1、2、1、3、2、1],则输出将为:[2、3、3,-1、3、2]
为了解决这个问题,我们将遵循以下步骤-
n:=数组大小
定义一个称为res的数组,大小为n,并用-1填充,定义一个堆栈st
对于我在0到2n范围内
res [堆栈顶部]:= x
从堆栈中删除顶部元素
index:= i mod n,x:= nums [index]
当st不为空且nums [堆栈顶部] <x
将索引插入堆栈
返回资源
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
cout << "[";
for(int i = 0; i<v.size(); i++){
cout << v[i] << ", ";
}
cout << "]"<<endl;
}
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
int n = nums.size();
vector <int> res(n, - 1);
stack <int> st;
for(int i = 0; i < 2 * n; i++){
int idx = i % n;
int x = nums[idx];
while(!st.empty() && nums[st.top()] < x){
res[st.top()] = x;
st.pop();
}
st.push(idx);
}
return res;
}
};
main(){
Solution ob;
vector<int> v = {1,2,1,3,2,1};
print_vector(ob.nextGreaterElements(v));
}[1,2,1,3,2,1]
输出结果
[2,3,3,-1,3,2]