leetcode84:柱状图中最大的矩形

84. 柱状图中最大的矩形 - 力扣(LeetCode) (leetcode-cn.com)

这道题我们先观察一下不难发现如下规律;

以heights[i]为高的最大矩形面积为

[ri-le+1]*heights[i]

其中ri是下标k在i右边时最靠近i且满足heights[k]<heights[i]的下标k的值

le同理为左边的值

那么接下来就好办了,直接滑动窗口,但是这里又要求ri的值,所以我们可以利用reverse函数将数组倒置过来,间接求出ri

具体代码如下

const int N=100010;

class Solution {
public:
	int le[N] = { 0 }, ri[N] = { 0 };

	void getle(vector<int> a, int st[]) {

		deque<int> que;//这里也可以用栈,但是我喜欢双端队列:D
		que.push_front(0);

		for (int i = 1; i < a.size(); i++) {//简简单单的滑动窗口

			while (que.size() && a[que.back()] >= a[i]) 
				que.pop_back();

			if(que.size())st[i] = que.back();

			que.push_back(i);

		}

	}

	int max2(int a, int b) {
		return a > b ? a : b;
	}


	int largestRectangleArea(vector<int>& heights) {

		heights.insert(heights.begin(), -1);//前后插入一个足够小的数,用于消除边界问题
		heights.push_back(-1);

		getle(heights, le);
		reverse(heights.begin(), heights.end());
		getle(heights, ri);
		reverse(heights.begin(), heights.end());

		int max1 = -1;

		for (int i = 1; i < heights.size() - 1; i++) {

			max1 = max2(heights[i] * (heights.size() - ri[heights.size()-i-1]-1 -le[i]-1), max1);//因为ri数组的下标和数组都是相对倒置过的数组而言的,所以我们得转换一下

		}

		return  max1;



	}
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值