leetcode_day03
https://leetcode-cn.com/problems/container-with-most-water/
题目:盛水最多的容器
给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (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的更多相关文章
随机推荐
- spring boot1.5.6 测试类1
package com.example.demo; import org.junit.Before;import org.junit.Test; import org.junit.runner.Run ...
- redux详解
redux介绍 学习文档:英文文档,中文文档,Github redux是什么 redux是一个独立专门用于做状态管理的JS库(不是react插件库),它可以用在react, angular, vue等 ...
- 在c#中using和new这两个关键字有什么意义?
在c#中using和new这两个关键字有什么意义?答:using 引入名称空间或者使用非托管资源, new 新建实例或者隐藏基类方法
- LinkedHashMap使用心得
基本概念:https://www.cnblogs.com/xiaoxi/p/6170590.html 遇到问题: 1.构造方法 public static LinkedHashMap<Strin ...
- mysql存储问题
为什么标题要起这个名字呢?commen sence指的是那些大家都应该知道的事情,但往往大家又会会略这些东西,或者对这些东西一知半解,今天我总结下自己在mysql中遇到的一些commen sense类 ...
- Win10下安装zookeeper
Win10下安装zookeeper 注册中心zookeeper的安装 0.去Apache官网下载zookeeper http://zookeeper.apache.org/ 2.找到解压路径的conf ...
- JS - 兼容的事件助手
(function () { // 兼容的事件助手 window.CompatibleEventHelper = { addEventListener: function (elem, type, c ...
- tcp服务端socket
import socket if __name__ == '__main__': # 创建tcp服务端socket tcp_server_socket = socket.socket(socket.A ...
- Web前端开发面试技巧
Web前端开发面试技巧 面试前端工程师对我来说是一件非常有意思的事,因为面试过程很大程度上也是自我提升的过程.无论大公司还是小公司,之所以在如何招聘到真正有能力的,前端工程师方面会遇到同样的问题. 近 ...
- Python生成器、装饰器
## 生成器 - 生成器是用来创建Python序列的一个对象 - 通常生成器是为迭代器产生数据的 - 例如range()函数就是一个生成器 - 每次迭代生成器时,它都会记录上一次调用的位置,并返回下一 ...