单调栈(一)寻找右侧第一个大于它的数

单调栈

单调栈就是单调递增或递减的栈。单调栈在接雨水、看楼、求最大矩形面积等问题都有运用。

题目:

给出一个数组 a[]; 寻找数组里每个数右侧比它大的第一个数的下标。要求:
1)输出的是下标
2)没有比它大的数的时候,输出下标为a.size()

示例:
a=[ 5,2,3,1,2,6 ];
输出:
result=[5 ,2 , 5 , 4 , 5 , 6]

#include
#include
#include 
#include 
using namespace std;
vector<int> findNextBig(vector<int> nums) {
	int n = nums.size();
	stack<int> st;
	vector<int> res;
	for (int i = n- 1; i >= 0;i--) {	//从右往左
		
		while (!st.empty() && nums[i] > nums[st.top()])	st.pop();
		
		if (st.empty())	res.push_back(n);	//栈为空,说明右侧没有比它大的数
		else res.push_back(st.top());
		
		st.push(i);
	}
	reverse(res.begin(), res.end());
	return res;
}


int main() {
	vector<int> nums({ 7,5,2,3,1,2,6 });
	vector<int> res = findNextBig(nums);
	for (int i : res) {
		cout << i << "  ";
	}
	system("pause");
	return 0;
}
算法分析

1)下面是代码的核心部分。注意是从右往左遍历的,因为这是求右边的第一个最大的数。

	for (int i = n- 1; i >= 0;i--) {	//从右往左
		
		while (!st.empty() && nums[i] > nums[st.top()])	st.pop();
		
		if (st.empty())	res.push_back(n);	//栈为空,说明右侧没有比它大的数
		else res.push_back(st.top());
		
		st.push(i);
	}

对nums[i]的到来,有两种情况
1、nums[i] > nums[st.top()] : 说明nums[st.top()] 不是比它大的数,st.top()出栈; 经过while()循环出栈以后,因为比nums[i]小的都出栈了,所以要么 nums[st.top()] >=nums[i], 要么栈为空,
2、nums[i]< nums[st.top()] : 那么nums[st.top()] 就是第一个比nums[i] 大的数。

综上,第一个比 nums[i] 大的数总是在 st.top();

你可能感兴趣的:(算法学习)