柱状图中最大矩形

HW2020.8.26 笔试第二题

题目描述
一个仓库的一排连续整齐的摆放了长宽不等的n个矩形箱子(n=[1,100]),现在要这些高低不等的箱子组成的柱形图中,找到一块最大的完整矩形面积来贴一张海报。
输入:依次给出n个矩形箱子的宽度[1,100]和高度[1,100]。为简化起见,最多20个箱子。
输出:海报可用的最大矩形面积。
如果输入参数有任何错误或者非法输入,返回0。
示例:
x[]=[1,1,1,1,2,1,1];y[]=[5,2,5,4,5,1,6];n=7
海报可用的最大面积为4*4=16.(如图)
在这里插入图片描述
输入描述
输入:依次给出n个矩形箱子的宽度[1,100]和高度[1,100]。最多20个箱子。
宽度和高度数字串,前后用[ ]分隔。每个数字之间用逗号间隔。参见输入示例。

输出描述
输出:海报可用的最大矩形面积。

示例1
输入
[1,1,1,1,2,1,1],[5,2,5,4,5,1,6]
输出
16
说明
输入格式如上,前面为7个箱子的宽度(前后用[ ],每个数字之间用逗号间隔),后面为7个箱子的高度,输出为:海报最大可用面积16

示例2
输入
[1,-1,1,1,2,1,1],[5,2,5,4,5,1,6]
输出
0
说明
存在宽度输入错误,返回0.

解题

参考:leetcode 84.柱状图中最大的矩形
通过率90%
将宽度处理为1,用单调栈求出最大矩形。

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

int max(int x, int y) {
	return x > y ? x : y;
}

int largestRectangleArea(vector<int>& heights) {
	int res = 0;
	stack<int> st;
	st.push(-1);
	for (int i = 0; i < heights.size(); i++) {
		while (st.top() != -1 && heights[st.top()] >= heights[i]) {
			int tmp = st.top();
			st.pop();
			res = max(res, heights[tmp] * (i - st.top() - 1));
		}
		st.push(i);
	}
	while (st.top() != -1) {    //遍历结束时,处理栈中剩下的
		int tmp = st.top();
		st.pop();
		int t = heights.size() - st.top() - 1;
		res = max(res, heights[tmp] * t);
	}
	return res;
}

int main() {
	string str;
	vector<int> kuan;
	vector<int> gao;
	char c;
	int tmp;
	cin >> c;
	while (cin >> tmp >> c && c!=']') {	//宽度
		if (tmp > 1000 || tmp < 1) {
			cout << 0 << endl;
			return 0;
		}
		kuan.push_back(tmp);
	}
	kuan.push_back(tmp);
	if(kuan.size()>20 ||kuan.size()<1){	//最多20个箱子
		cout << 0 << endl;
		return 0;
	}
	cin >> c >> c;
	while (cin >> tmp >> c && c != ']') {	//高度
		if (tmp > 1000 || tmp < 1) {
			cout << 0 << endl;
			return 0;
		}
		gao.push_back(tmp);
	}
	gao.push_back(tmp);

	vector<int> Gao;
	int t = 0;
	for (int i = 0; i < kuan.size(); i++) {
		if (kuan[i] <= 0) {
			cout << 0 << endl;
			return 0;
		}	
		for (int j = 0; j < kuan[i]; j++)
			Gao.push_back(gao[t]);
		t++;
	}
	cout << largestRectangleArea(Gao);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值