寻找最佳建筑物以发射火箭的最有效方法是什么?

时间:2018-11-21 19:21:28

标签: python algorithm performance optimization big-o

我目前正在研究算法,以提高自己的技能。现在,我遇到了一个我无法放手的问题。
它是这样的:

  

我收到100套配置,每套配置包含一个数组   类似于刮板高度的数字。现在我需要找到   此阵列中的天空刮板,可让最佳视野启动   火箭来自。
  条件是所有后续建筑物必须   比第一个起点高(不能相等)   发射火箭的天空刮板之后的建筑物高度   从无关紧要。相关的是以下的高度   建筑物。

例如:

Input: 5 4 3 4 5

最好使用3个刮板,因为总共有4个刮板可以看到此刮板。

输出为4

我有一个实现为O(n ^ 2),但是太慢了,无法处理数千个刮板机...

# read all configurations
while configs > 0:
    count = int(input())
    h = list(map(int, str(input()).split()))

    if buildings_count > 1:
        if allValuesAreSame(h):
            results.append(2 if count > 2 else 1)
        else:
            places = [0 for x in range(buildings_count)]

            for sample_index in range(count):
                last_high = -1
                for i in range(count):
                    if i == sample_index:
                        last_high = -1
                    else:
                        if i < sample_index:
                            if last_high == -1:
                                last_high = h[i]
                                places[sample_index] += 1
                            else:
                                if h[i] < last_high:
                                    last_high = h[i]
                                    places[sample_index] += 1
                        elif i > sample_index:
                            if last_high == -1:
                                last_high = h[i]
                                places[sample_index] += 1
                            else:
                                if h[i] > last_high:
                                    last_high = h[i]
                                    places[sample_index] += 1

        results.append(max(places))
    else:
        results.append(0)

    print(f'{results[-1]}')
    configs -= 1

有人知道如何优化此算法吗?我已经为此工作了好几天,而且不知道如何进一步优化。

1 个答案:

答案 0 :(得分:0)

计算直到某个给定建筑物的减少建筑物的顺序,然后计算增加的​​顺序。存储减少的条纹与增加的条纹的总和。这应该允许O(n)

大致为伪代码:

decreasing = 0
increasing = 0
best = 0

for building in buildings:

    if building< last_building:
        decreasing +=1
    else
        past_decreasing = decreasing
        decreasing =0 

    if building > last_building:
        increasing +=1
    else:
        past_increasing = increasing
        increasing =0 

    if past_increasing+past_decreasing >best
         best = past_increasing+past_decreasing

这种或这种想法的变体应该只允许您循环一次。