leetcode——42.接雨水

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

 

posted @ 2019-10-08 10:17  欣姐姐  阅读(190)  评论(0编辑  收藏  举报