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;
}