LeetCode——42.接雨水【前后缀 & 双指针】
作者:互联网
题解
- 方法一:暴力的优化,前后缀数组预处理
- 方法二:双指针
AC-Code
- 前后缀数组
class Solution {
public:
int trap(vector<int>& height) {
int n = height.size();
int* pre = new int[n];
int* suf = new int[n];
memset(pre, 0, sizeof(int) * n);
memset(suf, 0, sizeof(int) * n);
for(int i = 0, maxHeight = 0; i < n; ++i)
pre[i] = maxHeight = max(maxHeight, height[i]);
for(int i = n - 1, maxHeight = 0; i > 0; --i)
suf[i] = maxHeight = max(maxHeight, height[i]);
int result = 0;
for(int i = 0; i < n; ++i){
result += min(pre[i], suf[i]) - height[i] > 0 ?
min(pre[i], suf[i]) - height[i] : 0;
}
return result;
}
};
- 双指针
class Solution {
public:
int trap(vector<int>& height) {
int n = height.size();
int result = 0;
int left = 0, right = n - 1;
int leftMax = 0, rightMax = 0;
while(left <= right) { // 不要少判断最中间的位置
if(leftMax < rightMax) { // 如果leftMax小,那么leftMax可信,利用它可以求left可以存储的rain water
leftMax > height[left] ?
result += leftMax - height[left] : (leftMax = height[left]);
++left;
}
else {
rightMax > height[right] ?
result += rightMax - height[right] : (rightMax = height[right]);
--right;
}
}
return result;
}
};
标签:pre,后缀,42,maxHeight,height,int,result,LeetCode,left 来源: https://blog.csdn.net/Q_1849805767/article/details/105315895