largest-rectangle-in-histogram

本文深入探讨了LeetCode上最大直方图面积问题的高效解决方案,通过双数组记录左右边界,实现了O(n)时间复杂度的算法,显著提高了求解效率。文章详细解释了算法思路,并提供了Python及C++代码实现。

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;
        
    }
};
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值