【LeetCode 热题 100】11. 盛最多水的容器 | python 【中等】
边练习边更新,加油!!!
更得没有做得快,乐
题目:
11. 盛最多水的容器
给定一个长度为 n
的整数数组 height
。有 n
条垂线,第 i
条线的两个端点是 (i, 0)
和 (i, height[i])
。
找出其中的两条线,使得它们与 x
轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
注意:
- 双指针的典型应用!!!(做完之后茅塞顿通)
标准做法:
先把两个指针指向0和-1
注意:①指针只能向内移动②只有矮的柱子变高,容积才有可能上升,所以谁矮移谁
class Solution:
def maxArea(self, height: List[int]) -> int:
l, r = 0, len(height) - 1
ans = 0
while l < r:
area = min(height[l], height[r]) * (r - l)
ans = max(ans, area)
if height[l] <= height[r]:
l += 1
else:
r -= 1
return ans
作者:力扣官方题解
链接:https://leetcode.cn/problems/container-with-most-water/solutions/207215/sheng-zui-duo-shui-de-rong-qi-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
自己的做法:【看题解后通过并超过】
参考了答案的思路,在寝室画了10分钟图
[ 用时: 7 m 42 s ]参考答案的向内侧移动的方法,只移动高的,不移动低的,只计算移动后高的,不计算移动后低的
可能比题解要算得快一些?因为在没有移动到更高的杆子的时候,没让它计算
class Solution(object):
def maxArea(self, height):
"""
:type height: List[int]
:rtype: int
"""
a = 0
b = len(height)-1
v = (b-a)*min(height[a],height[b])
max_v = v
while a != b:
if height[a]<height[b]:
a += 1
if height[a]>height[a-1]:
v = (b-a)*min(height[a],height[b])
else:
b -= 1
if height[b]>height[b+1]:
v = (b-a)*min(height[a],height[b])
if max_v<v:
max_v = v
return max_v
1.超时O(n2):把所有容积储存起来是一个多么朴实无华的想法
class Solution(object):
def maxArea(self, height):
"""
:type height: List[int]
:rtype: int
"""
# 长:j-i
# 宽:min(height[i],j)
# 最简单:每个都储存下来
l = []
for i,iz in enumerate(height):
for j,jz in enumerate(height[i+1:]):
l.append((j+1)*min(iz,jz))
return max(l)
2.超时O(n2):不存了,直接判断
只能说,内存从O(n2)到O(1)也是质的飞跃(只能显示出之前很蠢吧!!!找max还遍历一次)
class Solution(object):
def maxArea(self, height):
"""
:type height: List[int]
:rtype: int
"""
# 长:j-i
# 宽:min(height[i],j)
# 最简单:每个都储存下来
max_v = 0
for i,iz in enumerate(height):
for j,jz in enumerate(height[i+1:]):
v = (j+1)*min(iz,jz)
if max_v < v:
max_v = v
return max_v