我目前正在研究算法,以提高自己的技能。现在,我遇到了一个我无法放手的问题。
它是这样的:
我收到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
有人知道如何优化此算法吗?我已经为此工作了好几天,而且不知道如何进一步优化。
答案 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
这种或这种想法的变体应该只允许您循环一次。