• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
neverlandly
博客园    首页    新随笔    联系   管理    订阅  订阅

Leetcode: Trapping Rain Water

Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.

For example, 
Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.


The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image!

这道题做的比较艰辛,一开始自己想的是一个用stack的解法,感觉过于繁琐(出栈,入栈,计算容积),但未尝不是一个好的尝试,这个方法还是有点小问题,过后会好好想清楚。看了网上提示完成了最终的方法,这个方法两次遍历数组,第一次遍历找每个元素右边最大的元素,第二次遍历寻找每个元素左边最大的元素,同时计算该index可以存放的水容积: min{lefthighest, righthighest}-A[i]

用两个array

 1 public class Solution {
 2     public int trap(int[] A) {
 3         int[] left = new int[A.length];
 4         int[] right = new int[A.length];
 5         int sum = 0;
 6         for (int i=0; i<A.length; i++) {
 7             if (i == 0) left[i] = 0;
 8             else {
 9                 left[i] = Math.max(left[i-1], A[i-1]);
10             }
11         }
12         for (int i=A.length-1; i>=0; i--) {
13             if (i == A.length - 1) right[i] = 0;
14             else {
15                 right[i] = Math.max(right[i+1], A[i+1]);
16             }
17             if (Math.min(left[i], right[i]) > A[i]) {
18                 sum += Math.min(left[i], right[i]) - A[i];
19             }
20         }
21         return sum;
22     }
23 }

用一个array和一个变量

 1 public class Solution {
 2     public int trap(int[] A) {
 3         int[] left = new int[A.length];
 4         int right = 0;
 5         int sum = 0;
 6         for (int i=0; i<A.length; i++) {
 7             if (i == 0) left[i] = 0;
 8             else {
 9                 left[i] = Math.max(left[i-1], A[i-1]);
10             }
11         }
12         for (int i=A.length-1; i>=0; i--) {
13             if (i == A.length - 1) right = 0;
14             else {
15                 right = Math.max(right, A[i+1]);
16             }
17             if (Math.min(left[i], right) > A[i]) {
18                 sum += Math.min(left[i], right) - A[i];
19             }
20         }
21         return sum;
22     }
23 }

 

posted @ 2014-05-14 04:37  neverlandly  阅读(599)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3