leetcode股票最大收益,leetcode最大矩形_柱狀圖中的最大矩形

 2023-11-12 阅读 28 评论 0

摘要:難度:困難給定 n 個非負整數,用來表示柱狀圖中各個柱子的高度。每個柱子彼此相鄰,且寬度為 1 。leetcode股票最大收益、求在該柱狀圖中,能夠勾勒出來的矩形的最大面積。以上是柱狀圖的示例,其中每個柱子的寬度為 1,給定的高度為 [2

難度:困難

給定 n 個非負整數,用來表示柱狀圖中各個柱子的高度。每個柱子彼此相鄰,且寬度為 1 。

leetcode股票最大收益、求在該柱狀圖中,能夠勾勒出來的矩形的最大面積。

25c7d5ae7c43617a286d54547fb3d0e0.png

以上是柱狀圖的示例,其中每個柱子的寬度為 1,給定的高度為 [2,1,5,6,2,3]。

矩形的最大面積?

1d19314eb02f3bfae2c9c89480e1cbd2.png

圖中陰影部分為所能勾勒出的最大矩形面積,其面積為 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;}
};

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/172430.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息