原题题目
代码实现(思路启发后自解)
int trap(int* height, int heightSize){
int leftdp[heightSize+1],rightdp[heightSize+1],i,temp,sum = 0;
memset(leftdp,0,sizeof(leftdp));
memset(rightdp,0,sizeof(rightdp));
for(i=1;i<heightSize;i++)
{
temp = leftdp[i-1] + height[i-1] - height[i];
leftdp[i] = temp>0 ? temp : 0;
}
for(i=heightSize-2;i>=0;i--)
{
temp = rightdp[i+1] + height[i+1] - height[i];
rightdp[i] = temp>0 ? temp : 0;
sum += fmin(rightdp[i],leftdp[i]);
}
代码实现(二刷DAY 99 看了一解的提示 刷出来的 第一眼看到想到的两边遍历 但没想出来方法)
class Solution {
public:
int trap(vector<int>& height) {
int size = height.size(),ret = 0;
vector<int> leftdp(size,0),rightdp(leftdp);
for(int i=1;i<size;++i)
{
int temp = leftdp[i-1] + height[i-1] - height[i];
leftdp[i] = temp>0 ? temp : 0;
}
for(int i=size-2;i>=0;--i)
{
int temp = rightdp[i+1] + height[i+1] - height[i];
rightdp[i] = temp>0 ? temp : 0;
ret += min(rightdp[i],leftdp[i]);
}
return ret;
}
};
代码实现(三刷自解 DAY 166 C++)
class Solution {
public:
int trap(vector<int>& height) {
vector<int> cntleft(height),cntright(height);
int ret = 0;
for(int i=1;i<height.size()-1;++i)
cntleft[i] = max(cntleft[i-1],cntleft[i]);
for(int i=height.size()-2;i>=1;--i)
cntright[i] = max(cntright[i+1],cntright[i]);
for(int i=1;i<height.size()-1;++i)
{
int tmp = min(cntleft[i],cntright[i]) - height[i];
ret += tmp > 0 ? tmp : 0;
}
return ret;
}
};
代码实现(四刷自解 DAY 207 C++)
class Solution {
public:
int trap(vector<int>& height) {
vector<int> left(height.size(),0),right(left);
int size = height.size();
int left_max = 0;
for(int i=0;i<size;++i)
{
left_max = max(left_max,height[i]);
left[i] = left_max;
}
int right_max = 0;
for(int i=size-1;i>=0;--i)
{
right_max = max(right_max,height[i]);
right[i] = right_max;
}
int sum = 0;
for(int i=0;i<size;++i)
sum += (min(left[i],right[i]) - height[i]);
return sum;
}
};
代码实现(五刷自解 DAY 274 C++)
class Solution {
public:
int trap(vector<int>& height) {
vector<int> left(height.size(), 0);
vector<int> right(left);
int size = height.size();
int tmp = 0;
for (int i = 0; i < size; ++i) {
tmp = max(tmp , height[i]);
left[i] = tmp;
}
tmp = 0;
for (int i = size - 1; i >= 0; --i) {
tmp = max(tmp , height[i]);
right[i] = tmp;
}
int ans = 0;
for (int i = 0; i < size; ++i) {
ans += min(left[i], right[i]) - height[i];
}
return ans;
}
};
代码实现(六刷自解 DAY 3 Golang)
func max(x, y int) int {
if x >= y {
return x
} else {
return y
}
}
func trap(height []int) int {
leftpos, rightpos, leftnum, rightnum := 0, len(height) - 1, height[0], height[len(height) - 1]
ret := 0
for leftpos <= rightpos {
tmpleft, tmpright := height[leftpos], height[rightpos];
leftnum, rightnum = max(leftnum, tmpleft), max(rightnum, tmpright)
if leftnum <= rightnum {
ret += leftnum - tmpleft
leftpos++
} else {
ret += rightnum - tmpright
rightpos--
}
}
return ret
}