https://leetcode.com/problems/largest-rectangle-in-histogram/submissions/
class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
sz = len(heights)
lessfromLeft = [-1 for _ in range(sz)]
lessfromright = [sz for _ in range(sz)]
for i in range(1,sz):
p = i - 1
while p >= 0 and heights[p] >= heights[i]:
p = lessfromLeft[p]
lessfromLeft[i] = p
# print("lessfromLeft:",lessfromLeft)
for i in range(sz-2,-1,-1):
p = i+1
while p < sz and heights[p] >= heights[i]:
p = lessfromright[p]
lessfromright[i] = p
# print("lessfromright:",lessfromright)
maxres = 0
for i in range(sz):
maxres = max(maxres,heights[i]*(lessfromright[i]-lessfromLeft[i]-1))
return maxres
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int sz = heights.size();
vector<int> lessfromleft(sz,-1);
vector<int> lessfromright(sz,sz);
for(int i = 0;i < sz;i++){
cout<<"i:"<<i;
int p = i-1;
while(p >= 0 && heights[p] >= heights[i] )
p = lessfromleft[p];
lessfromleft[i] = p;
}
for(auto ll:lessfromleft) cout<<ll;
cout <<endl;
for(int i = sz-2;i > -1 ;i--){
int p = i+1;
while(p < sz && heights[p] >= heights[i])
p = lessfromright[p];
lessfromright[i] = p;
}
for(auto lr:lessfromright) cout<<lr;
cout <<endl;
int maxres = 0;
for(int j =0 ;j<sz;j++){
maxres = max(maxres,heights[j]*(lessfromright[j]-lessfromleft[j]-1));
}
return maxres;
}
};
本文深入探讨了LeetCode上最大直方图面积问题的高效解决方案,通过双数组记录左右边界,实现了O(n)时间复杂度的算法,显著提高了求解效率。文章详细解释了算法思路,并提供了Python及C++代码实现。
1万+

被折叠的 条评论
为什么被折叠?



