题目链接:https://leetcode.com/problems/next-greater-element-ii/
Given a circular array (the next element of the last element is the first element of the array), print the Next Greater Number for every element. The Next Greater Number of a number x is the first greater number to its traversing-order next in the array, which means you could search circularly to find its next greater number. If it doesn't exist, output -1 for this number.
Example 1:
Input: [1,2,1] Output: [2,-1,2] Explanation: The first 1's next greater number is 2;
The number 2 can't find next greater number;
The second 1's next greater number needs to search circularly, which is also 2.
Note: The length of given array won't exceed 10000.
方法一(暴力法,时间复杂度O(n*n)):
class Solution{
public:
vector<int> nextGreaterElements(vector<int>& nums)
{
vector<int> res;
int numsSize=nums.size();
for(int i=0;i<numsSize;i++)
{
int tmp=nums[i];
int size=0;
for(int j=i+1;size<numsSize;size++,j++)
{
int k=j%numsSize;
if(nums[k]>tmp)
{
res.push_back(nums[k]);
break;
}
}
if(size==numsSize)
res.push_back(-1);
}
return res;
}
};
方法二:
解题思路:
初始化一个栈s,s存nums的下标,结果数组res,res值全是-1,对nums遍历两次,如果nums[s.top()]的值小于nums[j],res[s.top()]=nums[j],s出栈,直到nums[s.top()]>=nums[j],随后s进j。
class Solution{
public:
vector<int> nextGreaterElements(vector<int>& nums)
{
vector<int> res(nums.size(),-1);
stack<int> s;
for(int i=0;i<2*nums.size();i++)
{
int j=i%nums.size();
while (!s.empty() && nums[s.top()]<nums[j])
{
res[s.top()]=nums[j];
s.pop();
}
s.push(j);
}
return res;
}
};