微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用堆栈的直方图中的最大矩形

如何解决使用堆栈的直方图中的最大矩形

嘿,朋友们,我正在解决这个问题,但我遇到了一个运行时错误,无法弄清楚为什么我的输入 [0,0] 会出现这个错误

如果在 0ms 响应时间内输入不是 [0,0],我的代码会给出正确答案..


这个问题和栈数据结构有关。这是屏幕截图和问题的链接..
链接 - https://leetcode.com/problems/largest-rectangle-in-histogram/

screenshot1

screenshot2

这是我输入 [0,0] 得到的错误

error screenshot


**这是我的代码** -
class Solution {
public:
    int largestRectangleArea(vector<int>& h) {
        vector<int> left,right;
        stack<pair<int,int>> l,r;
        //storing left smaller index
        for(int i = 0; i < h.size(); i++){
            if(l.empty()){
                left.push_back(-1);
                l.push({h[i],i});
            }else if(l.top().first < h[i]){
                left.push_back(l.top().second);
                l.push({h[i],i});
            }else if(!l.empty() && l.top().first > h[i]){
                while(!l.empty() && l.top().first > h[i]){
                    l.pop();
                }
                if(l.empty()){
                    left.push_back(-1);
                    l.push({h[i],i});
                }else{
                    left.push_back(l.top().second);
                    l.push({h[i],i});
                }
            }
        }
        //storing right smaller index
        for(int i = h.size() - 1; i >= 0; i--){
            if(r.empty()){
                right.push_back(h.size());
                r.push({h[i],i});
            }else if(r.top().first < h[i]){
                right.push_back(r.top().second);
                r.push({h[i],i});
            }else if(!r.empty() && r.top().first > h[i]){
                while(!r.empty() && r.top().first > h[i]){
                    r.pop();
                }
                if(r.empty()){
                    right.push_back(h.size());
                    r.push({h[i],i});
                }else{
                    right.push_back(r.top().second);
                    r.push({h[i],i});
                }
            }
        }
        reverse(right.begin(),right.end());
        
        vector<int> ans;
        int find;
        for(int i = 0; i < h.size(); i++){
            find = (right[i] - left[i]) - 1;
            find = find*h[i];
            ans.push_back(find);
        }
        return *max_element(ans.begin(),ans.end());
    }
};

解决方法

好像 vector h 中的每个元素都一样,你的代码会被破解。在您的前 2 个 for loop 有 3 个 if 语句中,当它遇到向量 h 中的第二个元素时,如果 h[0] = h[1] 那么所有 3 个 if 语句都不会满足,所以 {{1} } 和 left 向量将只有 1 个元素,在最后一个 right 中你遍历了 for loop 中的所有元素,它大于 1,所以你的代码在这里破解。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。