【问题标题】:How can you find the max rectangular area in histogram recursively?如何递归地找到直方图中的最大矩形区域?
【发布时间】:2019-12-06 17:26:10
【问题描述】:

我需要为“直方图中的最大矩形区域”问题提出一个递归解决方案。对于不熟悉的人,这里有一个解释:

直方图是一种统计信息的显示,它使用矩形来显示数据项的频率。这些矩形通常是垂直的。

在直方图中,所有条形通常大小不同。在这个问题中,你必须在直方图中找到最大的矩形区域。例如,如果尺寸为 [4,1,4,5,6],则最大面积为 12,因为我们取最后 3 个条形图 [4,5,6],取最短的条形图 [4],然后应用矩形面积公式 (4x3=12)。

唯一的要求是:

-必须在java中完成。

-无法使用堆栈。

-它必须是递归的。

如果有帮助,我有一个非递归解决方案:

public static int MaxHistograma(int[] histograma) {
        if (histograma.length == 1) {
            return histograma[0];
        }
        int res = 0;
        for (int i = 0; i < histograma.length - 1; i++) {
            int min = histograma[i];
            for (int j = i + 1; j < histograma.length; j++) {
                min = Math.min(min, histograma[j]);
                res = Math.max(histograma[j], Math.max(res, min * (j - i + 1)));
                res = Math.max(res, histograma[i]);
            }
        }
        return res;
    }

【问题讨论】:

  • 鉴于您有奇怪的约束,例如“它必须是递归的”,我想这是作业吗?如果是这样,您希望我们做什么?如果您希望我们编写整个解决方案(否),您希望从中获得什么?如果您不想要完整的解决方案,您具体要做什么?

标签: java recursion histogram


【解决方案1】:

如果您从具有 1 列的直方图的基本情况开始,则最大面积等于该列的高度。

当您添加包含第 2 列时,该区域可能是

1)等于上一个直方图的最大面积

2)等于第二列的高度

3)等于新形成的矩形的水平面积

当您查看第三列时,它是相同的。它可以是前一个直方图的最大面积(2 列)、新列的高度(红色)或水平矩形的面积(紫色)。

这是实现此目的的代码框架

private int getLargestArea(int[] histogram)
{
    if (histogram.length > 1)
    {
        int horizontalRectangleArea = 0; //TODO
        int lastColumnHeight = 0; //TODO

        return Math.max(
            Math.max(horizontalRectangleArea, lastColumnHeight),
            getLargestArea(Arrays.copyOf(histogram, histogram.length - 1)) //copy the array, subtracting 1 column
        );
    }
    else
    {
        return histogram[0]; // height of single column
    }
}

【讨论】:

    猜你喜欢
    • 2015-06-05
    • 2011-05-17
    • 1970-01-01
    • 2018-04-01
    • 2020-07-23
    • 2011-06-07
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    相关资源
    最近更新 更多