题目:给你一个数组,返回一个等长的数组,对应索引存储着下一个更大元素,如果没有更大的元素,就存 -1。
例如:给定一个数组 [2,1,2,4,3],应该返回数组 [4,2,4,-1,-1]。
解释:第一个 2 后面比 2 大的数是 4; 1 后面比 1 大的数是 2;第二个 2 后面比 2 大的数是 4; 4 后面没有比 4 大的数,填 -1;3 后面没有比 3 大的数,填 -1。
思路:其实就跟一个队列里面高矮不一的人排队站成一列,然后找出从当前人面前能够看到的第一个比他高的人是谁。
所以我们需要从后面开始遍历这个数组,开始的时候栈为空。这个时候,最后一名同学后面没有人,那么他对应的结果应该为-1,然后把他的身高放入栈中。倒数第二个同学来了,他先看栈里面有没有同学,如果有那么和栈顶的同学身高进行比较,如果比栈顶同学的身高要大,那么他就会挡住后面的这个元素,他前面的同学就看不到他后面的这个同学。所以我们就把这些同学从栈里面删除掉,然后接着比较新的栈顶的同学,直到剩下比他高的同学,或者把栈清空。依次类推。如果栈不为空,那么对应的结果为栈顶的同学身高,否则为-1;
vector<int> nextGreaterElement(vector<int>& nums) {
stack<int>s;
vector<int>v(nums.size());
for (int i = nums.size()-1; i >= 0; i--)//倒着往栈里面放
{
while (!s.empty()&&nums[i]>=s.top())//发现栈里面有比自己小的数就移除,因为从前往后看看不到它们
{
s.pop();
}
nums[i] = s.empty() ? -1 : s.top();//栈里没有元素说明后面没有更大的数,有元素就输出头元素。
s.push(nums[i]);//每个元素都必须入栈
}
return v;
}