42 接雨水

  1. class Solution {
  2. public int trap(int[] height) {
  3. // 纵向求解每个位置能够装的水
  4. int ans = 0;
  5. if (height == null || height.length == 0)
  6. return ans;
  7. int[] leftMax = new int[height.length];
  8. int currLeftMax = leftMax[0] = 0;
  9. for (int i = 1; i < height.length; i++) {
  10. if (currLeftMax < height[i - 1]) {
  11. currLeftMax = height[i - 1];
  12. }
  13. leftMax[i] = currLeftMax;
  14. }
  15. int[] rightMax = new int[height.length];
  16. int currRightMax = rightMax[height.length - 1];
  17. for (int i = height.length - 2; i >= 0; i--) {
  18. if (currRightMax < height[i + 1]) {
  19. currRightMax = height[i + 1];
  20. }
  21. rightMax[i] = currRightMax;
  22. }
  23. for (int i = 0; i < height.length; i++) {
  24. if (height[i] < Math.min(leftMax[i], rightMax[i]))
  25. ans += Math.min(leftMax[i], rightMax[i]) - height[i];
  26. }
  27. return ans;
  28. }
  29. }