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. 页面js中文乱码解决

    <script src="../Content/kindeditor-4.1.5/kindeditor.js" charset="utf-8" >& ...

  2. 第一个AngularJS表达式实例

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  3. rbg的代码

    不得不赞rbg的代码,写的是真的好,各种异常都考虑到了,至少常见的异常没有了. 还有selective search的代码,也是很赞. 而edgebox的代码则不行啊,demo写的太死,而且代码里只能 ...

  4. 大白话讲解BP算法(转载)

    最近在看深度学习的东西,一开始看的吴恩达的UFLDL教程,有中文版就直接看了,后来发现有些地方总是不是很明确,又去看英文版,然后又找了些资料看,才发现,中文版的译者在翻译的时候会对省略的公式推导过程进 ...

  5. linux安装openldap步骤

    目录 虚拟机环境:centos 7 一.环境准备 1.关闭 selinux firewalld 临时: setenforce 0  永久: vi /etc/sysconfig/selinux SELI ...

  6. 【vlan-端口配置】

    搭建好拓扑图如下: 分别配置两台终端的ip地址 创建vlan把e0/4/0接口加入到新的vlan中 连通性失败 . 同理在把e0/4/1加入到vlan视图中 连通性成功 : 搭建好拓扑图如下 进入e0 ...

  7. dts--tests(三)

    sample_built.py """ DPDK Test suite. Test sample_built. """ import uti ...

  8. TP5 webuploader 单页面多实例上传图片 案例

    在使用 webuploader上传文件过程中,如果同一个页面存在多个上传区域,可以参考本示例代码. HTML 代码: <!DOCTYPE html> <html> <he ...

  9. PLC状态机编程第五篇-状态机自动生成PLC程序

    这篇比较简单了,我就直接上图了,不多废话. 一.选择求解器,一定要选择定步长的. 二.右击Chart状态机,出现图上菜单 三.左边红色的勾选择,选择右侧的菜单,然后点击Generate Code按钮, ...

  10. 前言 openwrt简介

    什么是openwrt?先看一下度娘怎么说. OpenWRT是一个高度模块化.高度自动化的嵌入式Linux系统,拥有强大的网络组件和扩展性,常常被用于工控设备.电话.小型机器人.智能家居.路由器以及VO ...