From 596711051fb5b02ad6eee1354e3e0cec7c21d483 Mon Sep 17 00:00:00 2001 From: LeLe673893702 Date: Mon, 22 Jun 2020 11:45:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=8E=A5=E9=9B=A8=E6=B0=B4ja?= =?UTF-8?q?va=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\346\216\245\351\233\250\346\260\264.md" | 84 ++++++++++++++++++- 1 file changed, 83 insertions(+), 1 deletion(-) diff --git "a/\351\253\230\351\242\221\351\235\242\350\257\225\347\263\273\345\210\227/\346\216\245\351\233\250\346\260\264.md" "b/\351\253\230\351\242\221\351\235\242\350\257\225\347\263\273\345\210\227/\346\216\245\351\233\250\346\260\264.md" index b5f20ff..6929e0b 100644 --- "a/\351\253\230\351\242\221\351\235\242\350\257\225\347\263\273\345\210\227/\346\216\245\351\233\250\346\260\264.md" +++ "b/\351\253\230\351\242\221\351\235\242\350\257\225\347\263\273\345\210\227/\346\216\245\351\233\250\346\260\264.md" @@ -183,6 +183,88 @@ if (l_max < r_max) { ![labuladong](../pictures/labuladong.jpg) +暴力解法 + +```java +public int trap(int[] height) { + int ans = 0; + for (int i = 1; i < height.length - 1; i++) { + int leftMax = 0, rightMax = 0; + // 找右边最高的柱子 + for (int j = i; j < height.length; j++) { + rightMax = Math.max(height[j], rightMax); + } + // 找左边最高的柱子 + for (int j = i; j >= 0; j--) { + leftMax = Math.max(height[j], leftMax); + } + // 如果自己就是最高的话, + // leftMax == rightMax == height[i] + ans += Math.min(leftMax, rightMax) - height[i]; + } + return ans; +} +``` + +备忘录优化解法 + +```java +public int trap(int[] height) { + if (height == null || height.length == 0) return 0; + int ans = 0; + // 数组充当备忘录 + int[] leftMax = new int[height.length]; + int[] rightMax = new int[height.length]; + // 初始化base case + leftMax[0] = height[0]; + rightMax[height.length - 1] = height[height.length - 1]; + // 从左到右计算leftMax + for (int i = 1; i < height.length; i++) { + leftMax[i] = Math.max(height[i], leftMax[i-1]); + } + // 从右到左计算rightMax + for (int i = height.length - 2; i >= 0; i--) { + rightMax[i] = Math.max(height[i], rightMax[i + 1]); + } + // 计算结果 + for (int i = 1; i < height.length - 1; i++) { + ans += Math.min(leftMax[i], rightMax[i]) - height[i]; + } + return ans; +} +``` + +双指针解法 + +```java +public int trap(int[] height) { + if (height == null || height.length == 0) return 0; + + int ans = 0; + int leftMax, rightMax; + // 左右指针 + int left = 0, right = height.length - 1; + // 初始化 + leftMax = height[0]; + rightMax = height[height.length - 1]; + + while (left < right) { + // 更新左右两边柱子最大值 + leftMax = Math.max(height[left], leftMax); + rightMax = Math.max(height[right], rightMax); + + // 相当于ans += Math.min(leftMax, rightMax) - height[i] + if (leftMax < rightMax) { + ans += leftMax - height[left]; + left++; + } else { + ans += rightMax - height[right]; + right--; + } + } + return ans; +} +``` [eric wang](https://www.github.com/eric496) 提供 Java 代码 @@ -248,4 +330,4 @@ def trap(self, height: List[int]) -> int: [下一篇:如何去除有序数组的重复元素](../高频面试系列/如何去除有序数组的重复元素.md) -[目录](../README.md#目录) \ No newline at end of file +[目录](../README.md#目录) -- GitLab