链接:
题意
循环数组,找出每个元素的往后最近且大于它的元素
解:
今天没试暴力啊,大概率是过不了的
思路就是先找到最大的数,最大数的结果肯定是-1,然后倒着遍历数组,用一个栈来从大到小的存放数字,就可以很方便的得到离自身最近的比自己大的数字,同时由于是倒着遍历,所以栈内数字一定在当前遍历的数字之后
核心思路是,从后往前遍历时 ,后遍历到的数字(位置靠前)的大 数字是可以完全替换掉先遍历到的小数字(位置靠后)
实际代码:
c++
#include<bits/stdc++.h>
using namespace std;
vector<int> nextGreaterElements(vector<int>& nums)
{
int maxIndex=-1;
int lg=nums.size();
stack<int>tMax;
vector<int>ans(lg,0);
for(int i=0;i<lg;i++)
{
if(maxIndex==-1 || nums[i]>nums[maxIndex])
{
maxIndex=i;
}
}
ans[maxIndex]=-1;tMax.push(nums[maxIndex]);
for(int i=1;i<lg;i++)
{
int mao=(maxIndex-i+lg)%lg;
while(tMax.size() && tMax.top()<=nums[mao])
{
tMax.pop();
}
if(tMax.size())
{
ans[mao]=tMax.top();
}
else ans[mao]=-1;
tMax.push(nums[mao]);
}
return ans;
}
int main()
{
vector<int> nums;
int temp;
while(cin>>temp)
{
nums.push_back(temp);
}
vector<int>ans=nextGreaterElements(nums);
int lg=ans.size();
//cout<<"lg:"<<lg<<endl;
for(int i=0;i<lg;i++)
{
cout<<"i:"<<ans[i]<<endl;
}
return 0;
}
限制:
1 <= nums.length <= 104
-109 <= nums[i] <= 109