難度:困難
給定 n 個非負整數,用來表示柱狀圖中各個柱子的高度。每個柱子彼此相鄰,且寬度為 1 。
leetcode股票最大收益、求在該柱狀圖中,能夠勾勒出來的矩形的最大面積。
以上是柱狀圖的示例,其中每個柱子的寬度為 1,給定的高度為 [2,1,5,6,2,3]。
矩形的最大面積?
圖中陰影部分為所能勾勒出的最大矩形面積,其面積為 10 個單位。
示例:
矩形面積最大問題,輸入: [2,1,5,6,2,3]
輸出: 10
來源:力扣(LeetCode)
leetcode c++。鏈接:力扣
解法一:暴力解法,先利用集合去重,記錄出出現過的高度,在針對每個高度去尋找最大的矩形——超時
class Solution {
public:int largestRectangleArea(vector<int>& heights) {set<int> heightSet;for(int h : heights)heightSet.insert(h);int ans = 0;for(int h_set : heightSet){int count = 0;int maxCount = 0;for(int h_s : heights){if(h_set <= h_s)count++;else{maxCount = max(maxCount,count);count = 0;}}maxCount = max(count,maxCount);ans = max(ans, maxCount * h_set);}return ans;}
};
解法二:動態規劃——超時
dp[i][j]表示從i到j最小的高度
class Solution {
public:int largestRectangleArea(vector<int>& heights) {int len = heights.size();int ans = 0;vector<vector<int>> dp(len,vector<int>(len,0));for(int i = 0; i < len; i++){for(int j = i;j < len; j++){if(i == j || heights[j] < dp[i][j-1])dp[i][j] = heights[j];elsedp[i][j] = dp[i][j-1];ans = max(ans, (j-i+1)*dp[i][j]);}}return ans;}
};
動態規劃,空間優化——超時!
class Solution {
public:int largestRectangleArea(vector<int>& heights) {int len = heights.size();int ans = 0;int pre = 0;int cur = 0;for(int i = 0; i < len; i++){for(int j = i; j < len; j++){if(i ==j || heights[j] < pre){cur = heights[j];}else{cur = pre;}pre = cur;ans = max(ans, (j-i+1)*cur);}}return ans;}
};
利用單調棧
單調棧里面的數據肯定是單調增減
class Solution {
public:int largestRectangleArea(vector<int>& heights) {stack<int> s;// 最數組的最前面后最后面加上1,確保原始數組的第一個和最后一個都可以成為答案輸出出來heights.push_back(0);heights.insert(heights.begin(),0);int ans = 0;for(int i = 0; i < heights.size(); i++){// 如果當前這個數小于棧最上面的數,那么棧最上面的這個數,它的矩陣最右邊就是當前i-1,因為i是右邊第一個比它小的// 左邊的就是棧里面第二個數的索引+1,因為棧是單調增的,下面的這個數肯定小于它while(!s.empty() && heights[s.top()] > heights[i]){int index = s.top();s.pop();int left = s.top()+1;int right = i-1;ans = max(ans, (right - left + 1)* heights[index]);}s.push(i);}return ans;}
};
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态