zoukankan      html  css  js  c++  java
  • 牛客网每日一练

    #
    # 
    # @param height int整型一维数组 
    # @return int整型
    #
    class Solution:
        def maxArea(self , height ):
            tempaer = 0
            maxtempaer = 0
            i = 0
            j = len(height) - 1
            if len(height) < 2:
                return None
            while i < j :
                tempaer = min(height[i], height[j]) * (j-i)
                if maxtempaer < tempaer:
                    maxtempaer = tempaer
                if height[i] < height[j]:
                    i += 1
                else:
                    j -= 1
            return maxtempaer
    S = Solution()
    H = input()
    H = H[1:-1]
    H = list(map(int , H.split(',')))
    print(S.maxArea(H))
            # write code here

    给定n个非负整数a1,a2,…,an,其中每个数字表示坐标(i, ai)处的一个点。以(i,ai)和(i,0)(i=1,2,3...n)为端点画出n条直线。你可以从中选择两条线与x轴一起构成一个容器,最大的容器能装多少水?

    题解:从两边向中间靠拢,得到面积的最大值,具体做法是,让i指向第一个数据,j指向最后一个数据,计算当前以第i个数据为左端点,第j个数据为右端点时形成的面积,依次让两个数据中的较小值向中间移动,每次计算当前面积并更新最大面积。
    证明为什么这样可以找到最大值,假设第x个数据和第y个数据形成的容器是最大的,我们让i从第一个出发,j从最后一个出发,如果i到达x,j还大于y,这时一定有height[j]<height[i](下面证明这个不等式,假如height[j]>height[x],那么这时的面积是height[i](j-x),这个面积一定比最优时的面积min(height[x],height[y])(y-x)大,那么就与假设矛盾了)且还有height[j]<height[y],证明同前面的,这样我们每次让较小的向中间移动一定不会错过最优解。同理i还小于x,j已经到达y的情况也一样。

  • 相关阅读:
    sqlserver,获取调用存储过程返回数据的方法。
    手动为弹窗添加一个阴影背景。
    bootstrap资料链接
    进入Linux救援(rescue)模式的四大法门
    virtual box 5.2.12 扩展包安装
    pypi配置国内开源镜像
    vs2015利用python加载dll调试配置
    ubuntu18安装ubuntu kylin软件中心
    firefox快捷键窗口和标签类
    设置双网卡路由
  • 原文地址:https://www.cnblogs.com/nenu/p/14638420.html
Copyright © 2011-2022 走看看