查找直方图中的所有矩形

时间:2018-01-20 23:18:29

标签: java algorithm dynamic-programming rectangles

我相信大多数人都听说过直方图问题中最大的矩形。 - Link -

在我目前的项目中,我需要更改此算法,以便在该直方图中找到所有不是另一个矩形的较小子集的矩形。

这是我目前的程度。但我无法弄清楚如何不计算这里的子集。

   //time: O(n), space:O(n)
     public ArrayList<int[]> largestRectangles(int[] height) {
            ArrayList<int[]> listRect = new ArrayList<int[]>();

            if (height == null || height.length == 0) {
                return null;
            }

            Stack<Integer> stack = new Stack<Integer>();

            int max = 0;
            int i = 0;

            while (i < height.length) {
                //push index to stack when the current height is larger than the previous one
                if (stack.isEmpty() || height[i] >= height[stack.peek()]) {
                    stack.push(i);
                    i++;
                } else {
                //add rectangle when the current height is less than the previous one
                    int p = stack.pop();
                    int h = height[p];
                    int w = stack.isEmpty() ? i : i - stack.peek() - 1;
                    listRect.add(new int[]{p,h,w});
                }

            }

            while (!stack.isEmpty()) {
                int p = stack.pop();
                int h = height[p];
                int w = stack.isEmpty() ? i : i - stack.peek() - 1;
                listRect.add(new int[]{p,h,w});
            }

            return listRect;
        }
public static void main(String[] args) {

         for(int[] rect : largestRectangles(new int[]{1,2,2,3,3,2})) {
             System.out.print("pos:"+rect[0]+" height"+rect[1]+" 
         width"+rect[2]);
             System.out.println();
         }
     }

1 个答案:

答案 0 :(得分:1)

想法是检查添加的新矩形是否包含最后添加的矩形;如果是这样,那么只需在添加新的矩形信息之前从结果列表中删除最后添加的矩形信息(因此按高度确认)。我没有Java IDE,所以在C#中尝试过。

以下是您需要在listRect.Add(new [] {p,h,w}之前)在两个地方添加的部分(请转换为java)。

if (listRect.Count > 0)
{

    if (listRect[listRect.Count - 1][1] <= h)
    {
        listRect.RemoveAt(listRect.Count - 1);
    }
}

这只是一个想法。您必须编写逻辑以省略上面的删除逻辑,直方图中包含0,即new int [] {1,2,2,3,3,2,0,1}等。但逻辑类似;您必须存储旗帜等,并根据其位置绕过去除最后一个矩形。