zoukankan      html  css  js  c++  java
  • 84. Largest Rectangle in Histogram


    July-27-2019

    这个题做了好久,面试遇到就跪了,只会暴力解。
    而且也讲不明白。简单说就是用stack保证递增:
    添加2,下一个是1,不递增了,POP出2然后算结果是乘积是2.
    继续添加1 5 6,然后下一个是2,不递增了,POP出6和5算乘积是6和10.
    添加2和3,此时STACK里是123,没了。
    POP出3 和 2,乘积是3和4.
    底的计算方式是当前I-高的

    重点是最后一个POP出的元素,是目前为止最小的,就是1,要乘以总长度,从0到6。可以把ARRAY加一个0放到最后,这样最后总会POP出一次。

    我在最后一个元素的地方想了很久,比如把图里的1换成0,还对不对了?
    [2,0,5,6,2,3]

    结果还是对的,然而我想不明白为什么是对的,结果上来说确实是,2*4=8不影响。不管有多少个0在里面都不影响,有0的区别就是0永远POP不出来,最后计算就没有总长度那一次了。

    这个题做得还是蛮绝望的。

        public int largestRectangleArea(int[] heights) {
            if (heights.length == 0) return 0;
            ArrayDeque<Integer> stk = new ArrayDeque<>();
            int res = 0;
            heights = Arrays.copyOf(heights, heights.length + 1);
            heights[heights.length - 1] = 0;
            for (int i = 0; i < heights.length; i++) {
                if (stk.isEmpty() || heights[stk.peek()] < heights[i]) {
                    stk.push(i);
                } else {
                    int tempH = heights[stk.pop()];
                    int base = 0;
                    if (stk.isEmpty()) {
                        base = i;
                    } else {
                        base = i - stk.peek() - 1;
                    }
                    res = Math.max(res, base * tempH);
                    i -- ;
                }
            }
    
            return res;
        }
    
  • 相关阅读:
    数据仓库系列之ETL过程和ETL工具
    大数据从入门到精通
    Mysql误删表中数据与误删表的恢复方法(转)
    Vscode 小白使用介绍
    Window 通过cmd查看端口占用,杀死进程方法
    Python基础教程,Python入门教程(非常详细)
    tuxedo安装与配置入门
    Win10系统Ping端口及利用telnet命令Ping 端口
    Tuxedo 介绍
    hibernate框架的简单入门
  • 原文地址:https://www.cnblogs.com/reboot329/p/11259103.html
Copyright © 2011-2022 走看看