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. php简单开启gzip压缩方法(zlib.output_compression)

    网上的教程基本是你抄我来我抄他,不外乎加头加尾或者自构函数两种写法.实际上每个php页面都要去加代码——当然也可以include引用,不过总显得略微麻烦   一般而言,页面文件开启gzip压缩以后,其 ...

  2. 【P1330】 封锁阳光大学

    两个和谐河蟹不能在同一条边的两端.所以对于每条边.只有一个节点有和谐河蟹 所以说,我们可以将有和谐河蟹的看做一种颜色,或则是状态.没有河蟹看做另一种言颜色 这样边变成了二分图染色 所以嗯~(・∀・) ...

  3. Vue nodejs商城项目-搭建express框架环境

    1.express-project 搭建express框架环境 安装express generator生成器 通过生成器自动创建项目 配置分析 安装 cnpm i -g express-generat ...

  4. ImportError : cannot import name main

    当我们有时候安装不成功插件或者其他模块时候,会有pip报错hu@hu-VirtualBox:~/下载/MySQL-python-1.2.4b4$ pip install pymysqlTracebac ...

  5. 通过ip地址访问同一局域网下已经启动的angular项目

    通常tomcat启动的项目同一局域网下我们都可以访问.angular启动的前台项目别人怎么访问,一直不懂,后来知道启动命令加个参数就行了 首先查看本机ip 第二步,启动命令里加上--host 本机ip ...

  6. kruscal 模板

    /* Kruskal模板 */ struct edge{ int from; int to; int next; int value; bool operator<(const edge a) ...

  7. 灵光一现的trick

    感觉平时会丢掉好多挺好的trick…… 图论 1.图G,固定S,T.可以将任意一条边加上权值$k(k>0)$,求最大化加权后最短路. 2.图G,固定S,T.可以将任意一条边乘以权值$k(k> ...

  8. 【杂题总汇】HDU-6406 Taotao Picks Apples

    [HDU 6406]Taotao Picks Apples 多校赛的时候多写了一行代码就WA了……找了正解对拍,在比赛结束后17分钟AC了

  9. IBM Rational Software Architect V9.0安装图解

    IBM Rational Software Architect(RSA) -- IBM软件开发平台的一部分 – 是IBM在2003年二月并购Rational以来,首次发布的Rational产品.改进过 ...

  10. PHP审计(一)

    一.php中常见的危险函数和审计要点 危险函数(功能过于强大)    参数是否外部可控,有没有正确的过滤. PHP获取外界传入参数是通过下面几个全局函数的形式,所以审计参数传入经常要和下面几个变量打交 ...