Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 计算可见建筑物最小数量的算法?_Algorithm - Fatal编程技术网

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

Algorithm 计算可见建筑物最小数量的算法?,algorithm,Algorithm,我一直在试图制定一个算法来解决一个问题。在这个问题中,我们有一张包含一些建筑物的照片。照片分为n个垂直区域(称为块),并给出每个块中的建筑高度 一座建筑可能跨越几个连续的部分,但每个部分只能包含一个可见的建筑,或者根本不包含任何建筑。我们需要找到建筑物的最小数量 e、 g。 鉴于 3(件数) 1 2 3(高度)ans=3 三, 1.2.1 ans=2 六, 1 2 3 1 2 3 ans=5(一个有助于显示重叠的图形) 虽然我觉得我明白了,但我无法为它找到一个可靠的算法。有什么想法吗 您可以从给

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

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

e、 g。 鉴于

3(件数)

1 2 3(高度)ans=3

三,

1.2.1 ans=2

六,

1 2 3 1 2 3 ans=5(一个有助于显示重叠的图形)


虽然我觉得我明白了,但我无法为它找到一个可靠的算法。有什么想法吗

您可以从给定数组中找到最小的数字,并说明该数字的所有发生情况。这将把数组分割成多个子数组,现在需要递归地解决每个子数组的问题

在示例中:

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求解(int[]ar,int开始,int结束){
//递归的基->子数组具有单个元素
if(end-start==1)返回1;
//递归的基->子数组为空
如果(结束-开始<1)返回0;
//找敏
int m=int.MaxValue;
for(int i=start;i
您能解释一下第二个和第三个示例吗?我一定错过了什么……这是家庭作业吗?对我来说,这听起来像是。如果建筑物是在网格上“绘制”的,那么每一行代表一个特定的高度,而一列代表一个“块”——这有助于可视化/接近规则吗?另外,清理初始数据描述:)这里有一个提示:如果输入的高度为2或1,则高度为3的建筑将强制结束。因为你想要最小的数字,所以没有理由提前结束。保留那些还没有结束的建筑看起来像是一堆工作…@frodo,你能在你所说的例子中解释得更清楚一点吗?谢谢你的回答。但是我不确定我是否完全理解这个想法。你能解释一下吗?谢谢。我做了更多的工作,这个算法不能处理碎片中可能有空白点的情况。有人对此有什么想法吗?非常感谢。刚刚解决了这个问题,对空点进行了必要的修改。你能解释一下这种方法的原因吗?这种算法在最坏的情况下(高度是按排序顺序给出的)是以二次时间工作的,所以我真的很惊讶它能在在线法官身上工作。我猜测试很弱。事实上,我的跑步时间相当不错。:)
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;
}