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

  • 相关阅读:
    Python使用SMTP模块、email模块发送邮件
    harbor搭建及使用
    ELK搭建-windows
    ELK技术栈之-Logstash详解
    【leetcode】1078. Occurrences After Bigram
    【leetcode】1073. Adding Two Negabinary Numbers
    【leetcode】1071. Greatest Common Divisor of Strings
    【leetcode】449. Serialize and Deserialize BST
    【leetcode】1039. Minimum Score Triangulation of Polygon
    【leetcode】486. Predict the Winner
  • 原文地址:https://www.cnblogs.com/nenu/p/14638420.html
Copyright © 2011-2022 走看看