LeetCode-503. 下一个更大元素 II

241 篇文章 1 订阅
210 篇文章 0 订阅

给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。

示例 1:

输入: [1,2,1]
输出: [2,-1,2]
解释: 第一个 1 的下一个更大的数是 2;
数字 2 找不到下一个更大的数; 
第二个 1 的下一个最大的数需要循环搜索,结果也是 2。
注意: 输入数组的长度不会超过 10000。

 

我们先不考虑最后数字的循环搜索,只考虑当前数组,当前元素的下一个更大元素

也就是说下一个元素要比当前的元素大,才能作为当前元素的vector元素,我们考虑一种情况:

假设有一个数组为:  9,7,3,1,-1,10 对于元素 9来说,它的下一个更大元素为10,并且同时7,3,1,-1的更大元素也为10

所以我们可以发现,对于严格满足单调递减的元素,他们的下一个更大元素是相同的(如果最后一个数为8,则单调递减的序列为 7,3,1,-1,8。

此时9将不会出现在单调递减序列当中)。我们可以考虑使用单调递减栈来记录最大值。即最大值一定在栈顶。

此单调栈的规则满足:

(1)如果栈为空,则进行入栈。

(2)如果栈不为空:

当前元素比栈顶元素小,则将当前元素入栈。

当前元素比栈顶元素大,则一直弹出栈顶,直到栈顶元素比当前元素大,则再下一个元素

此时通过依次弹出的栈顶元素的下一个最大值一定为栈顶元素。

为方便运算,考虑单调栈存储数组的下标。

 

循环搜索:考虑将数组拉长,即将数组copy一半接在数组的后面,当然我们没有必要再空间上

真的区copy一次数组,我们考虑每次遍历的长度为2*N,下标使用i%N 就可以了(其中N为数组的长度)。

#include <iostream>
#include <vector>
#include <stack>
using namespace std;


//单调栈
class Solution {
public:
	vector<int> nextGreaterElements(vector<int>& nums) {
		int N = nums.size();
		vector<int> mGreater(2 * N, -1);

		for (int i = 0; i < 2 * nums.size(); i++) {
			if (m_stack.empty()) {
				m_stack.push(i % N);
			}
            //栈不为空,且当前元素大于栈顶元素,弹出栈顶元素
			while (!m_stack.empty() && nums[i % N] > nums[m_stack.top()]) {
				int index = m_stack.top();
				mGreater[index] = nums[i % N];
				m_stack.pop();
			}
            //入栈
			m_stack.push(i % N);
		}
		mGreater.assign(mGreater.begin(), mGreater.begin() + N);
		return mGreater;
	}

private:
	stack<int> m_stack;
};


int main() {
	vector<int> val = { 1,2,1 };
	vector<int> res;
	Solution* ps = new Solution();
	res = ps->nextGreaterElements(val);
	for (int i = 0; i < res.size(); i++) {
		cout << res[i] << endl;
	}

	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值