来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/trapping-rain-water 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

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

解答

解题思路:

  1. 把问题拆分为每个柱子的该接多少雨水来思考

解法一:

  1. 每个柱子能接多少雨水,取决于它左边的最高柱和右边的最高柱
  2. 作为性能优化,可以先找出每个条目的左边最高柱和右边最高柱,并缓存起来
  3. 然后走一遍所有柱子,通过每根柱子找到其左右两边的最高柱,然后求出差值,差值求和

解法二:

  1. 使用双指针解法
  2. 左指针和右指针,谁可以走,取决于谁比较低。谁低谁先走
  3. 如果走到柱子,小于等于当前最大值,则求差值并求和
  4. 如果走到柱子,大于最大值,则更新最大值为当前柱值
  5. 当左右指针遇到时结束

解法二为最优解

  1. /**
  2. * @param {number[]} height
  3. * @return {number}
  4. */
  5. var trap = function(height) {
  6. let returnHeight = 0;
  7. let start = 0,
  8. end = height.length - 1,
  9. lMax = height[start],
  10. rMax = height[end];
  11. while (start <= end) {
  12. if (lMax < rMax) {
  13. if (height[start] <= lMax) {
  14. returnHeight += lMax - height[start];
  15. } else {
  16. lMax = Math.max(lMax, height[start]);
  17. }
  18. start++;
  19. } else {
  20. if (height[end] <= rMax) {
  21. returnHeight += rMax - height[end];
  22. } else {
  23. rMax = Math.max(rMax, height[end]);
  24. }
  25. end--;
  26. }
  27. }
  28. return returnHeight;
  29. };