• leetcode-hard-array-11 Container With Most Water -NO


    mycode  time limited

    class Solution(object):
        def maxArea(self, height):
            """
            :type height: List[int]
            :rtype: int
            """
            final = 0
            for i in range(1,len(height)):
                temp = []
                for j in range(i):
                    h = min(height[j],height[i])
                    width = i - j
                    temp.append(h*width)
                final = max(final,max(temp))
            return final
            

    参考:

    把求水的容量转换成求面积

    假设: 第i条和第j条(i < j)线和x轴围起来面积最大,那么最大面积为Sij = min(ai, aj) * (j - i);

    那么:

    • 在j的右边没有比他更高的线

    • 在i的左边也没有比他更高的线

    证明 :
    反证法:
    如果在j的右边存在比他高的线为第k第线, 那么Sik = min(ai, ak) *(k - i), 由于k > j,所以Sik > Sij,与Sij最大的条件矛盾。
    同理可证在i的左边也没有比他更高的线。

    从上面说的性质可以说明, 从头和尾分别向中间遍历a1, a2, ..., an, 如果遍历的线比前面的高,则更新当前最高,并算出面积与之前存的最大面积比较,当前更大则更新,否之则跳过。

    但有一个问题: 头和尾哪个先向中间遍历呢?

    --高度矮的个。 因为如果高的向中间移动了,那矮的那边就不可能遍历到高的现在遍历的那个点了,就可能找不到最大面积。

    例如:

    这也是动态规划的用法。

    class Solution(object):
        def maxArea(self, height):
            """
            :type height: List[int]
            :rtype: int
            """
            l = 0 
            r = len(height)-1
            res = 0
            while l < r :
                h = min(height[l] , height[r])
                w = r - l
                res = max(res , h*w)
                #print(l,r,res)
                if height[l] < height[r]:
                    l += 1
                else:
                    r -= 1
            return res
  • 相关阅读:
    嵌入级联分类器
    AdaBoost 和 Real Adaboost 总结
    二分图匹配--匈牙利算法
    更新说明
    使用Visual Studio 2015 Community 开发windows服务
    C#字符串的不变性
    Windows 7 IIS HTTP 错误 500.21 – Internal Server Error 解决方法
    asp.net的请求管道事件
    Http请求过程
    css简单学习属性2---背景图片
  • 原文地址:https://www.cnblogs.com/rosyYY/p/11038955.html
Copyright © 2020-2023  润新知