https://leetcode-cn.com/problems/container-with-most-water/

题目:盛水最多的容器

给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (iai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (iai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器,且 n 的值至少为 2

思路:循环遍历,容器的宽,永远是容器两端中,比较矮的那一端

长度:两端距离

把所有可能性,都算一边,然后比较,找到最大的,即可。

 class Solution:
def maxArea(self, a):
max_area = min(a[0], a[1])
for i in range(0, len(a)):
for j in range(i+1, len(a)):
area = min(a[i], a[j]) * (j - i)
if area > max_area:
max_area = area
return max_area

存在问题:暴力解法,耗时太长。。。

更新:

看了官方答案之后。从两侧开始移动更好。

盛水面积公式:

h = J - I

Area = min(a[I], a[J]) * h

只要,两端向内部移动,则长度h一定变小

而我们的目的是:要让面积Area变大!!!

所以,就一定要使min(a(i),a(j))变大

   ——所以,制约问题的核心,就是两端较小的那一侧

   ——所以,我们的目的就是,要让两端较小的那一侧变大!

   ——所以,只需要移动较小的那一端就可以。

A:

  

(1)假设移动值较大的一侧(i):

  a:a[i]变小,跑到了1处,变得比较小侧a[j]还小,则min(a[i], a[j])变小,h变小,area变小。

  b:  a[i]变大,跑到了3处,min(a[i], a[j]) 保持不变,还为a[j](因为此时a[j]没有移动),h变小,area变小。

(2)假设移动值较小的一侧(j):

  a:a[j]变小,跑到了2处,变得比原来更小,则min(a[i], a[j])变小,h变小,area变小。

  b:a[j]变大,跑到了4处,变大比原来大,甚至比原来较大一侧更大,则min(a[i], a[j])变大,h变小,area有可能变大

  c:a[j]变大,跑到了5处,变大比原来大,但是不如原来较大一侧更大,则min(a[i], a[j])变大,h变小,area有可能变大

综上所述:Area变大的情况只有:让原来两端较小的一侧变大。

 ——所以只需要移动值较小的一端,并且让其变大(如果较小的一端移动之后,值还变小了,则无需计算Area值,继续移动)。

还有一个问题:i向右移动,j向左移动,最终,二者可能翻转过来,i跑到j的右侧,j在i的左侧,此时,就又和之前的情况发生重复。

解决方法:while i < j:——只计算让i小于j

代码:

 class Solution:
def maxArea(self, a):
i = 0
j = len(a)-1
max_area = min(a[i], a[j]) * (j-i)
while i < j:
if a[i] < a[j]:
old = a[i]
i += 1
if a[i] < old:
continue
else:
old = a[j]
j -= 1
if a[j] < old:
continue
area = min(a[i], a[j]) * (j-i)
if max_area < area:
max_area = area
return max_area

    

leetcode_day03的更多相关文章

随机推荐

  1. 关于 npm install 命令

    使用 `npm install` 命令安装模块时 ,有以下几种形式: 安装模块到项目 node_modules 目录下,不会将模块依赖写入 dependencies 或 devDependencies ...

  2. HTTP 之缓存

    这是一篇知识性的文档,主要目的是为了让Web缓存相关概念更容易被开发者理解并应用于实际的应用环境中.为了简要起见,某些实现方面的细节被简化或省略了.如果你更关心细节实现则完全不必耐心看完本文,后面参考 ...

  3. Django之模型(model)中的choices字段的使用

    转载自:http://quke.org/post/django-model-choices.html Django模型中的字段有个choices属性,这个属性可以提供被选数据,choices的参数是一 ...

  4. Linux文件服务器实战(匿名用户)

    一.进程与线程 二.vsftp服务器 1.文件传输协议(file transfer protocol,FTP) 基于该协议ftp客户端和服务端实现文件共享,上传下载文件 FTP基于TCP协议生成一个虚 ...

  5. Windows的cmd命令查询指定端口占用的进程并关闭

    以端口8080为例: 1.查找对应的端口占用的进程:netstat  -aon|findstr  "8080"    ,找到占用8080端口对应的程序的PID号: 2.根据PID号 ...

  6. VMware中Ubuntu开机时停在启动界面,不进入X-window的解决办法

    启动Ubuntu虚拟机时,停在这个画面不动: 试了若干次,都是这样.尝试了新建一个虚拟机然后把.vmdk文件拷过去启动,无法解决. 尝试重启,在这个界面按esc进入grub: 选择恢复模式 recov ...

  7. .NET 客户IP地址捕捉

    MVC模式下要获取客户IP可以在ActionFilterAttribute中进行拦截 filterContext.HttpContext.Request.UserHostAddress 同样,在Web ...

  8. 【Effective C++ 读书笔记】条款04:确定对象使用前已先被初始化

    永远在使用对象之前先将它初始化.对于无任何成员的内置类型,你必须手工完成此事. 至于内置类型以外的任何其他东西,初始化责任落在构造函数身上.规则很简单:确保每一个构造函数都将对象的每一个成员初始化. ...

  9. 数据结构学习-AVL平衡树

    环境:C++ 11 + win10 IDE:Clion 2018.3 AVL平衡树是在BST二叉查找树的基础上添加了平衡机制. 我们把平衡的BST认为是任一节点的左子树和右子树的高度差为-1,0,1中 ...

  10. python 初学函数

    #len # s = '金老板小护士' # len(s) # def my_len(): #自定义函数 # i = 0 # for k in s: # i += 1 # print(i) # # le ...