单调栈

题目:给你一个数组,返回一个等长的数组,对应索引存储着下一个更大元素,如果没有更大的元素,就存 -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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值