• 84. Largest Rectangle in Histogram


    一、题目

      1、审题

     

      2、分析

        给一个正整数数组代表高度,且宽度为1,求该数组形成的矩形所能存储的最大容量。

    二、解答

      1、思路:

        方法一:

          列举出数组形成的矩形,即可找到最大容量。

          即宽度为 1 、2、3......n 的矩形, 其中高度为连续的 i 个整数中最小的一个。

          注意(使用 3 层循环,时间超出)

    public int largestRectangleArea(int[] heights) {
        
            int len = heights.length;
            if(len == 0)
                return 0;
            int max = 0;
            for (int i = 1; i <= len; i++) {    // 几个数之和
                for (int j = 0; j <= len - i; j++) {    // 计算连续 i 个数之和
                    if(i == 1) {
                        max = Math.max(max, heights[j]);
                    }
                    else {
                        int min = heights[j];
                        for (int k = j; k < j+i; k++) {
                            if(heights[k] < min)
                                min = heights[k];
                        }
                        max = Math.max(max, min * i);
                    }
                }
                
            }
            
            return max;
        }

      

      方法二、使用一个栈进行记录。

          根据元素的升序将数组分成 n 份,栈中每次处理 1 份,且处理时若第 i+1 份的最小值大于第 i 份的某个值,则该值是继续保持在栈中的。

          栈的特征为:

            ①、栈中存放的下标的元素是升序的

            ②、每个 index 均入栈

            ③、栈为空,则表示下标 i 的前边的元素值均比下标 i 的元素大

            ④、 i - 1 - stack.peek() 表示的是以该元素值为高时,所形成的矩阵的最大宽度。

    public int largestRectangleArea3(int[] heights) {
            
            int len = heights.length;
            Stack<Integer> stack = new Stack<>();
            int maxArea = 0;
            for (int i = 0; i <= len; i++) {
                
                int cur = (i == len ? -1 : heights[i]);
                while(!stack.isEmpty() && heights[stack.peek()] >= cur) {
                    int h = heights[stack.pop()];
                    int w = stack.isEmpty() ? i : i - 1 - stack.peek();
                    maxArea = Math.max(maxArea, h*w);
                }
                
                stack.push(i);
            }
            
            return maxArea;
        }
        
  • 相关阅读:
    Nginx调优
    Nginx的压缩配置
    【进阶 6-1 期】JavaScript 高阶函数浅析
    个人总结的一个中高级Java开发工程师或架构师需要掌握的一些技能
    Java程序猿跳槽应该学哪些方面的技术!
    xamarin学习之路 例一、嵌入网页
    xamarin学习之路 一、vs2015 环境搭建
    xamarin 学习异常问题解决方法
    js 替换字符串 replace函数运用
    76Byte让你的JQuery更快
  • 原文地址:https://www.cnblogs.com/skillking/p/9696854.html
Copyright © 2020-2023  润新知