• LeetCode 42. 接雨水 - PHP


    给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

     左右两边是漏的,就是第一个柱子和最后一个柱子不接雨水。

    暴力递归

    1. class Solution {
    2. /**
    3. * @param Integer[] $height
    4. * @return Integer
    5. */
    6. function trap($height) {
    7. $n = count($height);
    8. $ans = 0;
    9. for ($i = 1; $i < $n - 1; $i++) {
    10. $l_max = 0;
    11. $r_max = 0;
    12. // 找右边最高的柱子
    13. for ($j = $i; $j < $n; $j++)
    14. $r_max = max($r_max, $height[$j]);
    15. // 找左边最高的柱子
    16. for ($j = $i; $j >= 0; $j--)
    17. $l_max = max($l_max, $height[$j]);
    18. // 如果自己就是最高的话,
    19. // l_max == r_max == height[i]
    20. $ans += min($l_max, $r_max) - $height[$i];
    21. }
    22. return $ans;
    23. }
    24. }

    直接爆内存。

    双指针

    1. class Solution {
    2. /**
    3. * @param Integer[] $height
    4. * @return Integer
    5. */
    6. function trap($height)
    7. {
    8. $n = count($height);
    9. if (!$n) return 0;
    10. $l = 0;
    11. $l_max = $height[$l];
    12. $r = $n - 1;
    13. $r_max = $height[$r];
    14. $ans = 0;
    15. while ($l < $r) {
    16. if ($height[$l] < $height[$r]) {
    17. if ($height[$l] < $l_max) $ans += $l_max - $height[$l];
    18. else $l_max = $height[$l];
    19. $l++;
    20. } else {
    21. if ($height[$r] < $r_max) $ans += $r_max-$height[$r];
    22. else $r_max = $height[$r];
    23. $r--;
    24. }
    25. }
    26. return $ans;
    27. }
    28. }

    拿left指针做实例

    如果大于if ($height[$l] < $l_max)

    最终数量会加上当前最大的减掉$l指针指着的,$ans += $l_max - $height[$l];

  • 相关阅读:
    CSS3DRenderer, CSS3DObject, OrthographicCamera API 结合使用案例
    Rainiverse VoxEdit 大赛
    牛客网基础知识强化巩固-周结04
    Linux命令(88)之echo
    JS利用循环解决的一些问题
    腻子粉怎么选?
    设计模式<二> :策略模式
    Ubuntu中简单配置网络和安装pycharm
    75.【JavaWeb-03】
    兴趣社如何搭建一个兴趣社区?
  • 原文地址:https://blog.csdn.net/m0_37962554/article/details/138126477