zoukankan      html  css  js  c++  java
  • leetcode——84. 柱状图中最大的矩形

    class Solution(object):
        def largestRectangleArea(self, heights):
            """
            :type heights: List[int]
            :rtype: int
            """
            stack = []
            heights = [0] + heights + [0]
            res = 0
            for i in range(len(heights)):
                #print(stack)
                while stack and heights[stack[-1]] > heights[i]:
                    tmp = stack.pop()
                    res = max(res, (i - stack[-1] - 1) * heights[tmp])
                stack.append(i)
            return res
    执行用时 :108 ms, 在所有 python 提交中击败了69.00%的用户
    内存消耗 :13.6 MB, 在所有 python 提交中击败了41.18%的用户
     
    这道题不太会。。。。
     
    ——2019.11.4
     

    方法一:暴力法
    public int largestRectangleArea(int[] heights) {
            //暴力法
            int area = 0;
            for(int i = 0;i<heights.length;i++){ //从i向两边遍历,找到所有连续的比i位置高度高的位置,即可得到中间长度
                int j = i;
                while(j-1>=0){
                    if(heights[j-1] >= heights[i]){
                        j--;
                    }else{
                        break;
                    }
                }
                int k = i;
                while (k+1<heights.length){
                    if(heights[k+1] >= heights[i]){
                        k++;
                    }else{
                        break;
                    }
                }
                area = Math.max((k-j+1)*heights[i],area);
            }
            return area;
        }

     方法二:栈

    添加哨兵,单调栈

    public int largestRectangleArea(int[] heights) {
            int len = heights.length;
            if (len == 0) {
                return 0;
            }
    
            if (len == 1) {
                return heights[0];
            }
    
            int res = 0;
    
            int[] newHeights = new int[len + 2];
            newHeights[0] = 0;
            System.arraycopy(heights, 0, newHeights, 1, len);
            newHeights[len + 1] = 0;
            len += 2;
            heights = newHeights;
    
            Deque<Integer> stack = new ArrayDeque<>(len);
            // 先放入哨兵,在循环里就不用做非空判断
            stack.addLast(0);
    
            for (int i = 1; i < len; i++) {
                while (heights[i] < heights[stack.peekLast()]) {
                    int curHeight = heights[stack.pollLast()];
                    int curWidth = i - stack.peekLast() - 1;
                    res = Math.max(res, curHeight * curWidth);
                }
                stack.addLast(i);
            }
            return res;
        }

     ——2020.7.14

    我的前方是万里征途,星辰大海!!
  • 相关阅读:
    CentOS 基本设置
    CentOS 7 编译安装 Code::Blocks
    Java和C/C++进行DES/AES密文传输(借鉴)
    VS 2010 编译 Openssl
    Crypto++ 动态链接编译与实例测试
    c++11-bind的用法
    模板编程-迭代器
    LeetCode-Swap Nodes in Pairs
    LeetCode-Generate Parentheses
    Leetcode-Letter Combinations of a Phone Number
  • 原文地址:https://www.cnblogs.com/taoyuxin/p/11791167.html
Copyright © 2011-2022 走看看