🎈 作者:Linux猿
🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!
🎈 关注专栏: 数据结构和算法成神路【精讲】优质好文持续更新中……🚀🚀🚀
🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬
目录
一、题目描述
1.1 输入描述
1.2 输出描述
二、解题思路
三、代码实现
四、时间复杂度
🍓🍓🍓 更多 「华为上机真题」点击 「华为历年上机真题100例【精讲】」🎉🎉🎉
一、题目描述
给航天器一侧加装长方形或正方形的太阳能板,需要先安装两个支柱,再在支柱上安装太阳能板。但是航天器不同位置的支柱长度不同,太阳能板的安装面积受限于最短一侧的那根支柱长度
现在提供一组整型数组作为支柱的高度数据,假设每根支柱间距离相等为 1 个单位长度,计算如何选择两根支柱可以使太阳能板的面积最大。
1.1 输入描述
10,9,8,7,6,5,4,3,2,1
注意:支柱至少有 2 根,最多10000 根,能支持的高度范围 1~10^9 的整数。柱子的高度是无序的,例子中的递减只是巧合。
1.2 输出描述
25
说明:在 10 米高的支柱和 5 米高的支柱上安装,这两根支柱间宽度为 5,高度取最小的支柱高 5,面积即为 25。任取其他两根支柱所能获得的面积都小于 25。所以面积最大为 25。
二、解题思路
本题有点难度,和 84. 柱状图中最大的矩形 类似,主要解题思路是要知道太阳能面板的宽和高,太阳能面板面积 = 宽 x 高。
那么,我们可以遍历所有支柱,以当前支柱的高为高,那么包含当前支柱的最大宽度为:当前支柱的左右两侧各找连续的大于等于当前支柱高度的所有柱子。
例如:有 6 根支柱,高度分别为:2,1,5,6,2,3。那么以各个支柱为高度的太阳能面板的最大面积为:
支柱 1:高度为 2,最左边为到 2,最右边也为到 2,那么以支柱 1 为高度的太阳能面板的最大面积为 0;
支柱 2:高度为 1,最左边为到 2,最右边为到 3,那么以支柱 2 为高度的太阳能面板的最大面积为 5;
支柱 3:高度为 5,最左边为到 5,最右边为到 6,那么以支柱 3 为高度的太阳能面板的最大面积为 5;
支柱 4:高度为 6,最左边为到 6,最右边为到 6,那么以支柱 4 为高度的太阳能面板的最大面积为 0;
支柱 5:高度为 2,最左边为到 5,最右边为到 3,那么以支柱 5 为高度的太阳能面板的最大面积为 6;
支柱 6:高度为 3,最左边为到 3,最右边为到 3,那么以支柱 6 为高度的太阳能面板的最大面积为 0。
三、代码实现
代码实现如下所示。
#include <iostream>
#include <sstream>
#include <vector>
#include <string>
#include <stack>
using namespace std;
int largestArea(vector<int>& h)
{
int n = h.size();
vector<int> left(n), right(n);
stack<int> st;
for (int i = 0; i < n; ++i) {
while (!st.empty() && h[st.top()] >= h[i]) {
st.pop();
}
left[i] = (st.empty() ? -1 : st.top());
st.push(i);
}
st = stack<int>();
for (int i = n - 1; i >= 0; --i) {
while (!st.empty() && h[st.top()] >= h[i]) {
st.pop();
}
right[i] = (st.empty() ? n : st.top());
st.push(i);
}
int ans = 0;
for (int i = 0; i < n; ++i) {
ans = max(ans, (right[i] - left[i] - 2) * h[i]);
}
return ans;
}
int main()
{
string str;
while (cin>>str) {
stringstream stream(str);
vector<int>g;
while (getline(stream, str, ',')) {
g.push_back(atoi(str.c_str()));
}
int ans = largestArea(g);
cout<<ans<<endl;
}
return 0;
}
四、时间复杂度
时间复杂度:O(n)
在上述代码中,需要两次 for 循环遍历元素,所以时间复杂度 O(n)。
🍓🍓🍓 更多 「华为上机真题」点击 「华为历年上机真题100例【精讲】」🎉🎉🎉
🎈 感觉有帮助记得「一键三连」支持下哦!有问题可在评论区留言💬,感谢大家的一路支持!🤞猿哥将持续输出「优质文章」回馈大家!🤞🌹🌹🌹🌹🌹🌹🤞