1,python解法一:
思路:两个指针从两头向中间靠拢,遇到比自己小的就记下差值,遇到大于等于自己的就重新定义窗口,然后返回重做。
程序一:很久之前编写的。
# -*- coding: utf-8 -*-
"""
Created on Tue Jun 5 22:05:01 2018
@author: Administrator
"""
x=input('Input please:')
m,n=0,len(x)-1
res=0
while m<n:
mn=min(x[m],x[n])
if mn==x[m]:
m+=1
while m<n and mn>x[m]:
res+=mn-x[m]
m+=1
else:
n-=1
while m<n and mn>x[n]:
res+=mn-x[n]
n-=1
print 'The answer is:%d'%res
程序2:
class Solution(object):
def trap(self, height):
"""
:type height: List[int]
:rtype: int
"""
i,j,res=0,len(height)-1,0
while i<j:
if height[i]<height[j]:
a=i+1
c=height[i]-height[a]
while c>0:
res+=c
a=a+1
c=height[i]-height[a]
i=a
else:
a=j-1
c=height[j]-height[a]
while c>0:
res+=c
a=a-1
c=height[j]-height[a]
j=a
return res
2,C++解法:
思路:弄一个和height同样大的数组,dp[i]存储的是第i个数的左边最大值和右边最大值中较小的那个
class Solution {
public:
int trap(vector<int>& height) {
int n=height.size(),max1=0,res=0;
vector<int> dp(n,0);
for(int i=0;i<n;i++)
{
dp[i]=max1;
max1=max(max1,height[i]);
}
max1=0;
for(int i=n-1;i>-1;i--)
{
dp[i]=min(max1,dp[i]);
max1=max(max1,height[i]);
if(dp[i]>height[i])res+=dp[i]-height[i];
// else dp[i]=0;
}
// for(int i=0;i<=n;i++){
// res+=dp[i];
// }
return res;
}
};
注意:上面那个n不能减一,减一之后当本为零就变成-1,从而后面生成容器就会出错。!!!!!