【问题标题】:FInd the largest square in a histogramF找到直方图中最大的正方形
【发布时间】:2020-08-15 14:57:40
【问题描述】:

我得到了一个整数数组,例如,

a = [1, 2, 3, 5, 4, 8, 4, 5, 6]
a[i] -> Height of each bar in the histogram
0 < len(a) < 100
0 <= a[i] < 100 

我的任务是找出在这个直方图中我能找到的最大正方形的边长。

上述输入的输出是,

4

说明

我为解决方案编写了以下代码,但它给了我错误的答案。我找不到任何关于这个问题的相关文章。

def findMaxSquare(arr):
    cur = 0
    for i in range(n-1):
        min_height = arr[i]
        length = 1
        if min_height > 0:
            cur = max(cur, 1)
        for j in range(i+1, n):
            min_height = min(min_height, arr[j])
            length += 1
            if min_height < length:
                break
            cur = max(cur, min(min_height, length))
    return cur

【问题讨论】:

    标签: arrays python-3.x


    【解决方案1】:

    这个想法与直方图的最大矩形区域完全相同。这里,蛮力的想法是:

    对于当前条形高度,尝试在左侧和右侧最大扩展,同时跟踪当前条形左侧或右侧的最大高度。当我们这样做时,我们需要取当前条的计算扩展宽度和高度的最小值来标记当前条的最大面积正方形的边长。 该算法在 O(n^2) 和 O(n) 空间中运行。

    以下是优化后的版本(类似于直方图的最大矩形区域),最坏情况下时间复杂度为 O(n),空间为 O(n):

        public int maxSquareAreaHistogram(int[] heights) {
            Deque<Integer> stack = new LinkedList<>();
            int i=0, maxArea = 0;
    
            while (i < heights.length) {
                // Stack keeps track of last largest height. As soon as we
                // encounter a height which is less than the previous height,
                // we need to find the maximum area for the bar at the top of stack as
                // the area cannot be extended to the right. 
                while (!stack.isEmpty() && heights[i] < heights[stack.peek()]) {
                    int idx = stack.pop();
                    int width = stack.isEmpty() ? i : i - stack.peek() - 1;
                    int edge = Math.min(width, heights[idx]);
                    maxArea = Math.max(maxArea, edge * edge);
                }
    
                stack.push(i++);
            }
    
            while (!stack.isEmpty()) {
                int idx = stack.pop();
                int width = stack.isEmpty() ? i : i - stack.peek() - 1;
                int edge = Math.min(width, heights[idx]);
                maxArea = Math.max(maxArea, edge * edge);
            }
    
            return maxArea;
        }
    

    PS:代码是用Java编写的。

    【讨论】:

      【解决方案2】:

      我会建议你的解决方案

      • 首先确定所有可能的矩形(对于每个条,向左和向右搜索至少具有相同高度的其他条)
      • 然后,对于每个矩形,检查哪个更小.. 宽度或高度。并以较小的尺寸,建立正方形
      • 最后检查哪个是最大的正方形

      在您提供的示例中,bar-5 和 bar-7 都会返回一个高度为 4、宽度为 6 的矩形...所以您应该有 2 个矩形并且都解析为 4x4 正方形。

      【讨论】:

      • 这听起来像是一项家庭作业,我希望您自己考虑一下代码。有了算法的文字描述,自己实现代码应该已经很容易了。
      猜你喜欢
      • 2018-04-01
      • 1970-01-01
      • 2011-12-06
      • 2017-11-09
      • 2015-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-04
      相关资源
      最近更新 更多