计算可见建筑物最小数量的算法?

时间:2012-06-10 05:15:49

标签: algorithm

我一直在努力制定解决问题的算法。在这个问题上,我们有一张包含一些建筑物的照片。照片分为n个垂直区域(称为片段),并给出每个建筑物的高度。

一栋建筑可能会连续几个建筑物,但每件建筑物只能包含一个可见建筑物,或根本没有建筑物。我们需要找到最少数量的建筑物。

e.g。 给定,

3(没有碎片)

1 2 3(高度)ans = 3

3

1 2 1 ans = 2

6

1 2 3 1 2 3 ans = 5(图中的wud帮助显示重叠。)。

虽然我觉得我得到了它,但我无法得到一个可靠的算法。有任何想法吗?

1 个答案:

答案 0 :(得分:0)

您可以找到给定数组中的最小数字,并查找此数字的所有出现次数。这会将数组拆分成多个子数组,现在你需要递归地解决每个子数组的问题。

在示例中:

1 2 3 1 2 3 (total = 0)

最小的数字是1:

x 2 3 x 2 3 (total = 1)

现在你有2个子阵列。 求解第一个 - 最小的数字是2:

  x 3       (total = 2)

最后你有一个元素:total = 3 解决其他子阵列使其成为5。

以下是C#中的一些代码:

int Solve(int[] ar, int start, int end){
    //base for the recursion -> the subarray has single element
    if(end-start == 1) return 1;

    //base for the recursion -> the subarray is empty
    if(end-start < 1) return 0;

    //find min
    int m = int.MaxValue;
    for(int i = start; i < end; i++)
        if (ar[i] < m) m = ar[i];

    int total = 1;
    //find the subarrays and their contribution recursively
    int subStart = start;
    for(int subEnd = start; subEnd < end; subEnd++){
        if(ar[subEnd] == m) {
            total += Solve(ar, subStart, subEnd);
            subStart = subEnd + 1;
        }
    }
    total += Solve(ar, subStart, ar.Length);

    return total;
}