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的更多相关文章
随机推荐
- python_1_变量的使用
print("hello word") name="Qi Zhiguang" print("My name is",name) name2= ...
- HTML第一章:初始HTML
设置ws字体大小:左上角file-->Settings--->在搜索框中输入font 网页的第一行一定是<!DOCTYPE html>:网页声明,代表这个页面是h5页面html ...
- Android 最新学习资料收集
收集这份资料的灵感来源于我的浏览器收藏夹快爆了,后来在github 上也看到了很优秀的开源库的收集资料,非常的好,但是太过于多,也不够新,所以决定自己来做一个.原始的markdowm文件已经放到git ...
- DB总结1
DBA 重构 data new york committee cobol codasyl journal DDL DML 关系演算 域关系演算语言(QBE) 元祖关系演算语言 ...
- vscode + leetcode +github 同步
1.用VScode打开本地leetcode文件夹 C:\Users\Administrator\.leetcode 2.上传到本地git库 3.打开github桌面,上传到远程库
- lincode 680 Split String
Split String 描述 笔记 数据 评测 Give a string, you can choose to split the string after one character or ...
- WIN10下解决Failed installing tomcat X service
Win10下无法安装Tomcat的service.bat 来看本文的网友想必已经在自己电脑的cmd看了几百遍的Failed installing tomcat X service 字样,也认真检查过自 ...
- Go HTTP模块处理流程简析
Go语言提供完善的net/http包,用户使用起来非常方便简单,只需几行代码就可以搭建一个简易的Web服务,可以对Web路由.静态文件.cookie等数据进行操作. 一个使用http包建立的Web服务 ...
- angular常见问题总结
本文引自:https://www.cnblogs.com/zhoulujun/p/8881414.html 这篇是对angularJS的一些疑点回顾,是对目前angularJS开发的各种常见问题的整理 ...
- 汇编:实现C语言的 ||与&&运算
;C程序转汇编(或运算链接) DATAS SEGMENT a Dw b dw cc dw d dw m dw n dw string db dup(?) DATAS ends CODES SEGMEN ...