【问题标题】:Algorithm to compute minimum number of visible buildings?计算可见建筑物最小数量的算法?
【发布时间】:2012-06-13 13:21:05
【问题描述】:

我一直在尝试制定一种算法来解决问题。在这个问题中,我们有一张包含一些建筑物的照片。将照片分成 n 个垂直区域(称为碎片),并给出每个碎片中建筑物的高度。

一栋建筑可以跨越多个连续的部分,但每个部分只能包含一个可见的建筑,或者根本不包含任何建筑。我们需要找到最少的建筑物数量。

例如 给定,

3(件数)

1 2 3(高度)ans = 3

3

1 2 1 答案 = 2

6

1 2 3 1 2 3 ans = 5(一个数字有助于显示重叠。)。

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

【问题讨论】:

  • 你能解释一下第二个和第三个例子吗?我一定是错过了什么......
  • 这是作业吗?听起来对我来说是这样。
  • 如果建筑物被“绘制”在网格上,每一行代表一个特定高度,而一列代表一个“片段”——这对可视化/规则有帮助吗?的方法?另外,清理初始数据描述:)
  • 这里有一个提示:只要输入的高度为 2 或 1,高度为 3 的建筑物就会强制结束。由于您想要最少的数量,因此没有理由让它更快结束。保留尚未结束的建筑物看起来像是一堆工作......
  • @frodo,你能在你所说的例子中多解释一下吗?

标签: algorithm


【解决方案1】:

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

在示例中:

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;
}

【讨论】:

  • 感谢您的回复。但我不确定我是否完全掌握了这个想法。你能解释一下吗?谢谢。
  • 我做了更多的工作,这个算法不能处理碎片中可能有空点的情况。有人对此有想法吗?
  • 非常感谢。只是通过对空位进行必要的修改来解决它。您能否说明采用这种方法的原因?
  • 这个算法在最坏的情况下以二次时间运行(高度按排序顺序给出),所以我真的很惊讶它在在线法官上运行。
  • 我猜测试很弱。实际上,我的运行时间相当不错。:)
猜你喜欢
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-24
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多