更新
这是以前做过的题,今天拿来又看了一遍,然后发现。。。运行时间没变,运行内存消耗从半个月前的8.5M变为了现在的14.6M。。。问题来了,是leetcode的算法更新了?蜜汁。。。
然后我想这,每次将较短的一边想内移动,但是以后的边必须比移动前的边长,不然它会成为新的短边而且两边直接的距离变短了,存水量也就变少了;所以可以直接加一个判断,一直让短边向内移动,移动到一条比它长的边的时候停止,然后比较现在与之前的水量。
本来以为是个重大发现,结果是速度从96ms提升到了80ms。
然后我尝试把原来所有水量存入数组然后排序输出最大值的方式改为了直接用if语句判断输出,增加了4ms时间(在原来方法里这样改好像会增加10ms+,看来这个新方法确实减少了判断次数),减少了0.4M的内存。难道这就是传说中的时间换空间吗?QwQ
总结
从这次新的方法看来,一个程序的优化,代码的精简是其中一部分,还有一部分算法的精简。
class Solution:
def maxArea(self, h):
"""
:type height: List[int]
:rtype: int
"""
l = 0
r = len(h)-1
V = 0
aim = 0
while l < r:
V = min(h[l],h[r])*(r-l)
if V > aim:
aim = V
if h[l] <= h[r]:
new = l+1
while new < r and h[new] <= h[l]:
new += 1
l = new
else:
new = r-1
while new > l and h[new] <= h[r]:
new -= 1
r = new
return aim
–更新与2019年3月1日–
暴力枚举法
对所有线段两两配对,存储所有可能的容量,输出最高的容量。
下面代码在第42个通例的时候时间溢出了。
class Solution:
def maxArea(self, height):
"""
:type height: List[int]
:rtype: int
"""
nums = enumerate(height)
nums = sorted(nums, key=lambda x : x[1],reverse=False)
print(nums)
l = len(nums)
V = 0
aim = []
for i in range(l):
r = l - 1
while r > i:
V = nums[i][1]*(nums[r][0]-nums[i][0])
if V < 0:
V = -V
print(nums[i][1],nums[r][0],nums[i][0],'V:',V)
aim.append(V)
r -= 1
aim = sorted()
print(aim)
return aim[len(aim)-1]
改进
采用官方给的优化思想自己写了写。
这种方法主要是找到了一种新的方法去寻找最小的面积,还是要多储备一点算法的知识啊。
但是我下面这个代码速度并不是很快的,只打败了39%的人,我去评论翻翻速度更快一些的算法。
class Solution:
def maxArea(self, height):
"""
:type height: List[int]
:rtype: int
"""
h = height
l = 0
r = len(height)-1
V = 0
aim = []
while l < r:
V = min(height[l],height[r])*(r-l)
aim.append(V)
if h[l] <= h[r]:
l += 1
elif h[l] > h[r]:
r -= 1
aim = sorted(aim)
print(aim)
return aim[-1]