• 牛客网每日一练


    #
    # 
    # @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的情况也一样。

  • 相关阅读:
    C#中的cookie编程
    C# 键值对数据排序
    C#操作json类型数据
    深刻理解C#的传值调用和传引用调用
    .Net程序员玩转Android开发--ListView单击事件
    C#与Visual Basic的异与同
    初识C#程序结构
    【转】Java学习---线程间的通信
    【转】Mysql学习---MySQL悲观锁中的排它锁
    Linux uptime命令详解
  • 原文地址:https://www.cnblogs.com/nenu/p/14638420.html
Copyright © 2020-2023  润新知