【每日一題-leetcode】84.柱狀圖中最大的矩形

84.柱狀圖中最大的矩形

  1. 柱狀圖中最大的矩形

難度困難509收藏分享切換爲英文關注反饋

給定 n 個非負整數,用來表示柱狀圖中各個柱子的高度。每個柱子彼此相鄰,且寬度爲 1 。

求在該柱狀圖中,能夠勾勒出來的矩形的最大面積。

示例:

輸入: [2,1,5,6,2,3]
輸出: 10

1.暴力破解

思路

兩層遍歷確定每一層最大的面積,第三層循環確定每次最底的高, j-i+1 長 * 高 求出每次的面積

time:O(n^3)

space:O(1)

 public int largestRectangleArea(int[] heights) {
        int maxArea = 0;
        for(int i=0;i<heights.length;i++){ //多少輪
            for(int j=i;j<heights.length;j++){ //多少次
                int minHeigh = Integer.MAX_VALUE;
                for(int k=i;k<=j;k++)//每一次中最小值
                    minHeigh = Math.min(minHeigh,heights[k]);

                maxArea = Math.max(maxArea,minHeigh*(j-i+1));//每一次計算出最大值
            }
        }
        return maxArea;
    }

2.優化暴力

思路:每次利用之前的最低高

time:O(n^2)

space:O(1)

public int largestRectangleArea(int[] heights) {
        int maxArea = 0;
        for(int i=0;i<heights.length;i++){ //多少輪
            int minHeigh = Integer.MAX_VALUE;
            for(int j=i;j<heights.length;j++){ //多少次
                minHeigh = Math.min(minHeigh,heights[j]);
                maxArea = Math.max(maxArea,minHeigh*(j-i+1));//每一次計算出最大值
            }
        }
        return maxArea;
    }

3.棧

time:O(n)

space:O(n)

   public int largestRectangleArea(int[] heights) {
            Stack < Integer > stack = new Stack < > ();
            stack.push(-1);
            int maxarea = 0;
            for (int i = 0; i < heights.length; ++i) {
                while (stack.peek() != -1 && heights[stack.peek()] >= heights[i])
                    maxarea = Math.max(maxarea, heights[stack.pop()] * (i - stack.peek() - 1));
                stack.push(i);
            }
            while (stack.peek() != -1)
                maxarea = Math.max(maxarea, heights[stack.pop()] * (heights.length - stack.peek() -1));
            return maxarea;
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章