LeetCode算法题python解法:11. Container With Most Water

LeetCode第十一题

Given n non-negative integers a1a2, ..., an , where each represents a point at coordinate (iai). n vertical lines are drawn such that the two endpoints of line i is at (iai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.

Note: You may not slant the container and n is at least 2.

Example:

Input: [1,8,6,2,5,4,8,3,7]
Output: 49

中文题意大概是将列表中随便两个元素的 索引差当做长,两个元素值取小的那个当做高,面积 = 长 * 高。取一个列表可能出现的面积最大值。

最简单的方法是遍历两次列表(负责度 O(n^2)),求出所有的面积然后取最大的,但是这里有算法要求,复杂度太高会超时,所以只能用复杂度更低的算法。

这里有个规律:如果从两端开始取值,则值小的那个所能产生的面积最大值已经确定。因为 面积的高取两个元素较小的那个,最大的高已经确定只需要选择最大的长,已经是索引差最大的另一端。

举例:a = [2,8,6,1,5,4,8,3,7]    a[0]与a[len(a)] 比较大小,a[0]更小,那么能让a[0]能产生的最大值的元素只有a[len(a)], 因为其他元素比a[0]大没有意义。高取的是小元素,比a[0]小的元素更没有意义,这里需要的最大值。所以只要确定一端的元素小,能取到最大面积的元素肯定在另一端。值小的元素取完后就可以往里面继续取了,因为它的存在毫无意义。

代码如下:

class Solution(object):
    def maxArea(self, height):
        maxa = 0
        front = 0                    #定义两个变量当做索引
        behind = len(height) - 1    #从两端往中间取值,数值小的索引可以直接取到最大值,取完直接淘汰该索引
        while True:
            if front == behind:       #取到索引相同位为止
                break
            elif height[front] >= height[behind]:         #最前端的数大于最后端则最后一个值的最大值已经确定,可以取完淘汰了
                area = height[behind]*(behind - front)
                behind -= 1
                if area > maxa:
                    maxa = area
            else:                                            #同上
                area = height[front]*(behind - front)
                front += 1
                if area > maxa:
                    maxa = area
        return  maxa

这个算法时间复杂度是 O(n).

解题思路参考了博客园的其他文章。

Ry_Chen

原文地址:https://www.cnblogs.com/slarker/p/Ry_Chen.html

时间: 2024-10-14 02:09:56

LeetCode算法题python解法:11. Container With Most Water的相关文章

LeetCode算法题python解法:24. Swap Nodes in Pairs

原题: Given a linked list, swap every two adjacent nodes and return its head. Example: Given 1->2->3->4, you should return the list as 2->1->4->3. Note: Your algorithm should use only constant extra space. You may not modify the values in

LeetCode算法题python解法:23. Merge k Sorted Lists

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. Example: Input: [   1->4->5,   1->3->4,   2->6 ] Output: 1->1->2->3->4->4->5->6 题目大意就是给定多个已经排序的链表合并成一个排序的链表,我这里是将多个链表的值遍

LeetCode算法题python解法:25. Reverse Nodes in k-Group

Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. k is a positive integer and is less than or equal to the length of the linked list. If the number of nodes is not a multiple of k then left-out nodes in

【LeetCode】【Python题解】Container with most water

这道题真真是在面试中碰到过,可惜当时复杂度到O(n2)了,太挫了,怪不得没有通过面试. Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines,

【LeetCode】【Python解读】Container with most water

这个问题是芭芭拉在采访中遇到的,不幸的是,的复杂性O(n2)该,太失望了,难怪没有通过面试. Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lin

LeetCode算法题-Valid Perfect Square(Java实现-四种解法)

这是悦乐书的第209次更新,第221篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第77题(顺位题号是367).给定正整数num,写一个函数,如果num是一个完美的正方形,则返回True,否则返回False.例如: 输入:16 输出:true 输入:14 输出:false 注意:不要使用任何内置库函数,例如sqrt. 本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试. 02 第一种解法 暴力解法

LeetCode算法题-First Bad Version(Java实现-三种解法)

这是悦乐书的第200次更新,第210篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第66题(顺位题号是278).您是产品经理,目前领导团队开发新产品.不幸的是,您产品的最新版本未通过质量检查.由于每个版本都是基于以前的版本开发的,因此坏版本之后的所有版本也是坏的. 假设您有n个版本[1,2,...,n]并且您想找出第一个坏的版本,这会导致以下所有版本都不好.您将获得一个API bool isBadVersion(版本),它将返回版本是否错误. 实现一个函数来查找第一

LeetCode算法题-Move Zeroes(Java实现-三种解法)

这是悦乐书的第201次更新,第211篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第67题(顺位题号是283).给定一个数组nums,写一个函数将所有0移动到它的末尾,同时保持非零元素的相对顺序.例如: 输入:[0,1,0,3,12] 输出:[1,3,12,0,0] 注意: 您必须在不制作数组副本的情况下就地执行此操作. 最小化操作总数. 本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试. 02

LeetCode算法题-Power of Four(Java实现-六种解法)

这是悦乐书的第205次更新,第216篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第72题(顺位题号是342).给定一个整数(带符号的32位),写一个函数来检查它是否为4的幂.例如: 输入:16 输出:true 输入:5 输出:false 跟进:你可以在没有循环/递归的情况下解决它吗? 本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试. 02 第一种解法 特殊情况:当num小于等于1时,直接返回