class Solution: def trap(self, height) -> int: if len(height)<2: return 0 H=max(height) I=height.index(H) S=H*len(height) #print(S) S_1=sum(height) #print(S_1) height_cha=[H-height[i] for i in range(len(height))] height_1=height_cha[:I] height_2=height_cha[I:] if height_1==[]: S_2=0 else: s=height_1[0] h1=[] for i in range(len(height_1)): s=min(s,height_1[i]) h1.append(s) #print(h1) S_2=sum(h1) #print(S_2) if height_2==[]: S_3=0 else: s=height_2[-1] h2=[] for i in range(len(height_2)-1,-1,-1): s=min(s,height_2[i]) h2.append(s) #print(h2) S_3=sum(h2) return S-S_1-S_2-S_3
执行用时 :64 ms, 在所有 Python3 提交中击败了88.27%的用户
内存消耗 :14.6 MB, 在所有 Python3 提交中击败了5.00%的用户
思路:
height=[0,1,0,2,1,0,1,3,2,1,2,1]
1. 找到最大值3,求出最大容量:S=max*len(height)
2. 减去原本height所占的容量S_1=sum(height)
3.求出height[i]与max的差值:
height_cha=[H-height[i] for i in range(len(height))]
4.以最大值的位置分割列表为两个,因为右半部分需要倒序,不分割也没关系,少占内存
height_1=height_cha[:I]
height_2=height_cha[I:]
5.更新列表为最小值:
if height_1==[]:
S_2=0
else:
s=height_1[0]
h1=[]
for i in range(len(height_1)):
s=min(s,height_1[i])
h1.append(s)
6.求和相减,得到结果
人家双指针法更快。
——2019.10.8
自己做出来了
public int trap(int[] height) { int len = height.length; if(len == 0){ return 0; } int max = height[0]; int index = 0; int sum = 0;//计算柱子的体积 for(int i = 0;i<len;i++){ if(height[i] > max){ max = height[i]; index = i; } sum += height[i]; } sum += max - height[0]; sum += max - height[len-1]; //得到最大值max以及最大值对应的索引index for(int i = 1;i<index;i++){ height[i] = Math.max(height[i],height[i-1]); sum += (max - height[i]); } for(int j = len-2;j>index;j--){ height[j] = Math.max(height[j],height[j+1]); sum += (max - height[j]); } return max*len - sum; }
开心。
——2020.7.10