每周一课:L90-Tasks-from-Indeed-Prime-2015-challenge-(90-2)
P90.2 FloodDepth
Find the maximum depth of water in mountains after a huge rainfall.
-
P90.2 水深
暴雨过后,山中存水的最大深度
帮助一位地质学家调查一个有湖泊的山区。最近的一场暴雨淹没了这些湖泊。这位地质学家想知道这些湖泊中水深最深的是多少。将问题简化为二维。整个山区可分为若干小块,用一个长度为N的数组A来描述。A的每个元素都对应一块山区的高度(即当完全没有水时,该山区的高度)。降雨后,所有低洼地区(即两侧较高的山区)都尽可能多地蓄水。现在想知道整个地区被洪水淹没后的最大水深。假设整个山区外的海拔高度为零,并且山区的外部区域可以容纳无限量的水。
例如,考虑数组A:
A[0]=1,A[1]=3,A[2]=2,A[3]=1,A[4]=2,A[5]=1,A[6]=5,A[7]=3,A[8]=3,A[9]=4,A[10]=2
下图描述了洪水过后的情景:
灰色区域是数组A所描述的山区高度,蓝色区域表示低洼区域最大程度可以储蓄的的水。不难看出3号和5号山区的水深为2。编号为2、4、7和8的山区的水深均为1。因此该山区的最大水深为2。
编写函数:
def solution(A)
给定一个由N个整数组成的非空数组A,则返回最大水深。例如针对上面的例子,函数应返回2。对于数组:A[0]=5,A[1]=8,函数应返回0。
假定:
- N是区间[1,100,000]内的整数;
- 数组A的每个元素都是区间[1,100,000,000]内的整数;
- 解题思路
首先定义低洼区域,如果左峰高度小于右峰高度,则视为低洼区域。 并且要寻找最长的低洼区域,如下图所示(低洼区域1):
因为上面只考虑了左峰高度小于右峰高度的低洼区域,因此还要考虑左峰高度大于右峰高度的低洼区域(上图中的低洼区域2),因此只要将数组A反转过来,就可以了。然后选取两种情况得到的最大值即可。
- Python3代码
# -*- coding:utf-8 -*-
# &Author AnFany
# Lesson 90:Tasks from Indeed Prime 2015 challenge
# P 90.2 FloodDepth
def judge_depth(hill):
"""
寻找低洼区域,并返回最大水深
低洼区域的定义:左峰高度小于右峰高度的视为低洼区域
:param hill: 每一块山区的高度
:return: 最大水深
"""
max_depth = 0
if len(hill) <= 1:
return max_depth
right_high = 0 # 判断是否是低洼区域
start_height = hill[0] # 开始的高度
save_height = [] # 储存低洼区域的山区高度
for h in hill[1:]:
if start_height > h: # 低洼区域的左峰出现
right_high = 1
save_height.append(h)
else: # 低洼区域的右峰出现
if right_high: # 并且左峰也有,此时计算这个低洼区域的最大水深
max_depth = max(max_depth, start_height - min(save_height))
start_height = h # 重新定义低洼区域的左峰阈值
right_high = 0
save_height = [] # 重新定义储存低洼区域的山区高度
return max_depth
def solution(A):
"""
根据山区的高度,返回洪水过后这片山区蓄水的最大深度
:param A: 每一块山区的高度
:return: 最大水深
"""
return max(judge_depth(A[::-1]), judge_depth(A))
- 结果
点击获得更多编程练习题。欢迎Follow,感谢Star!!! 扫描关注微信公众号pythonfan,获取更多。