美文网首页
台阶积水问题

台阶积水问题

作者: OLDBIG9 | 来源:发表于2019-10-07 21:59 被阅读0次

数组中的每一个元素相当于一个台阶,假使水量足够大,那么台阶上的积水有多少,例如数组[0,1,0,1,2,1,0,1,3,2,1,2,1]的台阶积水量为6,示例图如下:


image.png

思路:模拟下雨,最低洼的地方最先积水,如1区域先积满水,然后2区域再积满水

先计算出所有的台阶分类,从小到大排序,
遍历台阶分类,找到每一级台阶之间的洼地,然后积水(使积水 与该级台阶持平),然后对更上一级台阶之间的洼地积水,以此类推

寻找洼地就是寻找该级台阶在数组中第一次以及最后一次出现的位置,针对两者之间低于该级的台阶进行积水

Code:

<?php

/**
 * 台阶积水问题
 * 数组中的每一个元素相当于一个台阶,
 * 假使水量足够大,那么台阶上的积水有多少,
 * 例如数组[0,1,0,1,2,1,0,1,3,2,1,2,1]的台阶积水量为6
 */

$arr = [0,1,0,1,2,1,0,1,3,2,1,2,1];

function arrayPool(Array $arr) :Int {
    $beforeRain = array_sum($arr);
    $arr2 = array_unique($arr);//所有台阶的大小分类
    sort($arr2);
    //只有同一级台阶或没有台阶,则无法积水
    if(count($arr2) <= 1){
        return 0;
    }

    //忽略0级台阶
    if($arr2[0] == 0){
        array_shift($arr2);
    }

    $rArr = array_reverse($arr, true);//为了方便查找台阶最后出现的位置 
    foreach($arr2 as $a){
        $left = array_search($a, $arr);//该级台阶第一次出现的位置
        $right  = array_search($a, $rArr);//最后出现的位置
        for($i = $left + 1; $i < $right; $i++){
            if($arr[$i] < $a){
                $arr[$i] = $a;
            }
        }
    }

    $afterRain = array_sum($arr);
    $pool = $afterRain - $beforeRain;
    return $pool;
}

echo arrayPool($arr);

个人想法请多指教

相关文章

  • 台阶积水问题

    数组中的每一个元素相当于一个台阶,假使水量足够大,那么台阶上的积水有多少,例如数组[0,1,0,1,2,1,0,1...

  • 台阶积水(Trapping Rain Water)

    计算蓝色部分(积水)面积

  • 腾讯一面题目及自己的答案

    1 输入一个数组表示台阶的高度,台阶槽之间可以积水,请问能积多少水 2 输入括号对,检查是否成对

  • 简单台阶问题

    1、一只青蛙一次可以跳上一级台阶,也可以跳上两级台阶,求该青蛙跳上一个n级台阶总共有多少种跳法?思路:假设n的函数...

  • 跳台阶问题

    跳台阶问题 题目描述: 一个台阶总共有 n 级,如果一次可以跳 1 级,也可以跳 2 级。求总共有多少种跳法,并分...

  • 跳台阶问题

    最近在刷一些数据结构的题,发现个很有趣的问题:跳台阶问题。 1. 第一题(引子):输出菲波那切数列的第N项。 斐波...

  • 数据结构

    翻书问题或者走台阶问题: 共有n个台阶,每次只能上1个台阶或者2个台阶,共有多少种方法爬完台阶。 共有n页书,每次...

  • 分享一下

    大家好,分享: 肺积水必需先按心包经再按膀胱经和肺经,因肺积水之前心包会先积水,心包积水之后,心脏运行出问题,各个...

  • 留短发,是我坚持过最久的事情。

    又忽晴忽雨,落了一整天暴雨。晚上下班回家,雨已没有下那么大,只是上坡路段还有积水。顺着台阶一层一层跳跃着,汇入台阶...

  • 积水

    看了这么多家新闻联播,我发现了,中国一下雨就淹了。市内看海,市外成洋……我们会不会重新回到水里……

网友评论

      本文标题:台阶积水问题

      本文链接:https://www.haomeiwen.com/subject/ubdmuctx.html