题目链接

接雨水

题目描述

image.png

实现代码

简单思想:对于每一个位置i,其能积水的情况为:height[i] 比当前位置左右两边的列表最大值left_max和right_max都要小;积水量为:min(left_max, right_max) - height[i]

实现代码如下:

  1. class Solution {
  2. public int trap(int[] height) {
  3. int len = height.length;
  4. if (len == 1) {
  5. return 0;
  6. }
  7. int result = 0;
  8. int left_max = height[0];
  9. for (int i = 1; i < len - 1; i++) {
  10. if(left_max <= height[i]) {
  11. left_max = height[i];
  12. continue;
  13. }
  14. // find right max
  15. int right_max = height[i + 1];
  16. for (int j = i + 2; j < len; j++) {
  17. if (right_max < height[j]) {
  18. right_max = height[j];
  19. }
  20. }
  21. // update result
  22. if (left_max <= height[i] || right_max <= height[i]) {
  23. left_max = left_max < height[i] ? height[i] : left_max;
  24. continue;
  25. }
  26. result += Math.min(left_max, right_max) - height[i];
  27. }
  28. return result;
  29. }
  30. }

在前面方法实现的基础上进行优化,我们可以先分别进行两次遍历计算每个位置的左边最大值和右边最大值,这样就能将复杂度降为O(n)了,如图示:
image.png