Codility每周一课:P90.2 FloodDepth

版权声明:AnFany https://blog.csdn.net/qq_32882309/article/details/87935374

0.png

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

下图描述了洪水过后的情景:

image

灰色区域是数组A所描述的山区高度,蓝色区域表示低洼区域最大程度可以储蓄的的水。不难看出3号和5号山区的水深为2。编号为2、4、7和8的山区的水深均为1。因此该山区的最大水深为2。

编写函数:

def solution(A)

给定一个由N个整数组成的非空数组A,则返回最大水深。例如针对上面的例子,函数应返回2。对于数组:A[0]=5,A[1]=8,函数应返回0。

假定:

扫描二维码关注公众号,回复: 5657953 查看本文章
  1. N是区间[1,100,000]内的整数;
  2. 数组A的每个元素都是区间[1,100,000,000]内的整数;
  • 解题思路

首先定义低洼区域,如果左峰高度小于右峰高度,则视为低洼区域。 并且要寻找最长的低洼区域,如下图所示(低洼区域1):

image

因为上面只考虑了左峰高度小于右峰高度的低洼区域,因此还要考虑左峰高度大于右峰高度的低洼区域(上图中的低洼区域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))
  • 结果

image

点击获得更多编程练习题。欢迎Follow,感谢Star!!! 扫描关注微信公众号pythonfan,获取更多。

image

image

猜你喜欢

转载自blog.csdn.net/qq_32882309/article/details/87935374