算法参考:https://mp.weixin.qq.com/s?__biz=MzAxODQxMDM0Mw==&mid=2247484482&idx=1&sn=9503dae2ec50bc8aa2ba96af11ea3311&source=41#wechat_redirect
备忘录算法使用Map存储已查询过的结果,用以减少循环次数。
public static int w() { int sumWater = 0; int[] a = {0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1}; //左侧最大值 int[] leftMaxArray = new int[a.length]; //右侧最大值 int[] rightMaxArray = new int[a.length]; leftMaxArray[0] = a[0]; rightMaxArray[rightMaxArray.length - 1] = 0; //获得左侧最大值 for (int j = 1; j < a.length; j++) { leftMaxArray[j] = Math.max(leftMaxArray[j - 1], a[j-1]); } //获取右侧最大值 for (int j = rightMaxArray.length - 2; j >= 1; j--) { rightMaxArray[j] = Math.max(rightMaxArray[j + 1], a[j+1]); } for (int i = 0; i < a.length - 1; i++) { //同时满足左侧最大值大于当前值,并且右侧最大值大于当前值,才可以接雨水 if (leftMaxArray[i] > a[i] && rightMaxArray[i] > a[i]) { int temp = Math.min(leftMaxArray[i], rightMaxArray[i]) - a[i]; sumWater += temp; System.out.println("i=" + i + ";值=" + a[i] + ";highLeftMax=" + leftMaxArray[i] + ";highRightMax=" + rightMaxArray[i] + ";sumWater=" + temp); } } System.out.println(sumWater); return sumWater; }