小Q在周末的时候和他的小伙伴来到大城市逛街,一条步行街上有很多高楼,共有n座高楼排成一行。
小Q从第一栋一直走到了最后一栋,小Q从来都没有见到这么多的楼,所以他想知道他在每栋楼的位置处能看到多少栋楼呢?(当前面的楼的高度大于等于后面的楼时,后面的楼将被挡住)
输入描述:
输入第一行将包含一个数字n,代表楼的栋数,接下来的一行将包含n个数字wi(1<=i<=n),代表每一栋楼的高度。
1<=n<=100000;
1<=wi<=100000;
输出描述:
输出一行,包含空格分割的n个数字vi,分别代表小Q在第i栋楼时能看到的楼的数量。
输入例子1:
6
5 3 8 3 2 5
输出例子1:
3 3 5 4 4 4
例子说明1:
当小Q处于位置3时,他可以向前看到位置2,1处的楼,向后看到位置4,6处的楼,加上第3栋楼,共可看到5栋楼。当小Q处于位置4时,他可以向前看到位置3处的楼,向后看到位置5,6处的楼,加上第4栋楼,共可看到4栋楼。
方法1:入栈出栈,只用循环两次,每次检查一个方向上可以看到的楼房个数(最快)
n = input()#6
building = list(map(lambda x:int(x), input().split()))#5 3 8 3 2 5
def count_visible(build_list):
builds = []; build_num = []
for i in range(int(n)-1):
if i==0:
builds.append(build_list[i])
elif build_list[i] < builds[-1]:#如果下一建筑,比可看到建筑的最后一个矮,肯定不会挡住后面,所以直接加进来
builds.append(build_list[i])
else:#如果比最后一个高,挡住了可看到的最后一个,那么就要删掉,一直删到挡不住后面
while len(builds)>0 and builds[-1] <= build_list[i]:
del builds[-1]
builds.append(build_list[i])#别往了把该建筑加进来,每一次循环到保存目前可以看到的
build_num.append(len(builds))#计数
return [0]+build_num
left = count_visible(building)#向左看
right = count_visible(building[::-1])[::-1]#向右看
print(' '.join([str(left[i] + right[i] + 1) for i in range(int(n))]))
方法2:逐个楼左右看,每次查找最高楼,删掉最高楼以后的楼(略慢)
n = input()#6
building = list(map(lambda x:int(x), input().split()))#5 3 8 3 2 5
def count_visible(build_list, count = 0):
while len(build_list)>0:
max_loca = build_list.index(max(build_list))
if len(build_list[:max_loca])>0:
count += 1
build_list = build_list[:max_loca]
else:
count += 1
break
return count
count = []
for i in range(int(n)):
left_count = count_visible(building[:i][::-1])
right_count = count_visible(building[i+1:])
count.append(str(left_count + right_count + 1))
print(' '.join(count))
方法3:逐个楼左右看,逐一排查(超级慢)
n = input()#6
building = list(map(lambda x:int(x), input().split()))#5 3 8 3 2 5
def count_visible(build_list, count = 0):
for i in range (1,len(build_list)):
if max(build_list[:-i])>=build_list[-i]:#如果遮住了
continue
else:#没遮住,就计数
count += 1
if len(build_list)!=0:
count += 1
return count
count = []
for i in range(int(n)):
left_count = count_visible(building[:i][::-1])
right_count = count_visible(building[i+1:])
count.append(str(left_count + right_count + 1))
print(' '.join(count))
10000个数据:
1、方法1用时:0.022s
2、方法2用时:3.312s
3、方法3用时:33s
2万+



被折叠的 条评论
为什么被折叠?



