zoukankan      html  css  js  c++  java
  • 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

    我的前方是万里征途,星辰大海!!
  • 相关阅读:
    用java实现输出英文小说飘中出现次数最多的前N个单词(附:使用文件读写)
    程序员修炼之道第一章读后感
    c++实现线性表中的顺序表(数据结构课程作业)
    java第二次课件课后动手动脑习题整理总结(2019年9月23号)
    课堂练习判断字符串是否为回文序列
    大二上学期九月周总结报告三
    以java实现的一个简单登录界面(带验证码)
    关于二进制的原码 、反码、补码的简要解释说明
    几种方式使用
    spring配置数据源的6种方式
  • 原文地址:https://www.cnblogs.com/taoyuxin/p/11633904.html
Copyright © 2011-2022 走看看