题目
双指针重点题目,深刻理解!!!
Python
class Solution:
def trap(self, height: List[int]) -> int:
ans = 0
lmax = height[0]
rmax = height[len(height) - 1]
l = 1
r = len(height) - 2
while l <= r:
if lmax <= rmax:
ans += max(lmax - height[l], 0)
lmax = max(lmax, height[l])
l += 1
else:
ans += max(rmax - height[r], 0)
rmax = max(rmax, height[r])
r -= 1
return ans
Java
解法1:备忘录
O(N) + O(N)
class Solution {
public int trap(int[] height) {
int n = height.length, res = 0;
int[] lMax = new int[n];
int[] rMax = new int[n];
lMax[0] = height[0];
rMax[n - 1] = height[n - 1];
for (int i = 1; i < n; ++i) {
lMax[i] = Math.max(lMax[i - 1], height[i]);
}
for (int i = n - 2; i >=0; --i) {
rMax[i] = Math.max(rMax[i + 1], height[i]);
}
for (int i = 0; i < n; ++i) {
res += Math.min(lMax[i], rMax[i]) - height[i];
}
return res;
}
}
解法2:双指针
O(N) + O(1)
class Solution {
public int trap(int[] height) {
int n = height.length;
int left = 0, right = n - 1, res = 0, lMax = height[0], rMax = height[n - 1];
while (left <= right) {
lMax = Math.max(lMax, height[left]);
rMax = Math.max(rMax, height[right]);
if (lMax <= rMax) {
res += lMax - height[left];
++left;
} else {
res += rMax - height[right];
--right;
}
}
return res;
}
}
// 版本2
class Solution {
public int trap(int[] height) {
int n = height.length;
if (n < 3) {
return 0;
}
int ans = 0;
int l = 0, r = n - 1, lMax = height[0], rMax = height[n - 1];
while (l < r) {
if (lMax <= rMax) {
ans += lMax - height[l];
++l;
lMax = Math.max(lMax, height[l]);
} else {
ans += rMax - height[r];
--r;
rMax = Math.max(rMax, height[r]);
}
}
return ans;
}
}