Leetcode第11题:
1.题目:

2. 我的代码过程一:
首先分析题意,就是给一个列表,然后以每一个元素的索引与其对应的元素构成一个坐标点,元素的大小就是该点的高度。然后要找出两两组合起来的体积最大的那个值,其实说体积不准确,因为是装水,所以两两组合时,考虑短板效应,高度要以最低的那个为准。
我想了下,没找到什么特别的技巧,所以只得先写一段暴力解决方法:
代码:
class Solution(object):
def maxArea(self, height):
max_v = 0
dic = {}
for i, row in enumerate(height):
dic[i] = row
for i, row in dic.items():
for j, col in dic.items():
_min = row if row < col else col
if (j-i)*_min > max_v:
max_v = (j-i)*_min
return max_v
这段代码的时间复杂度是O(n)=n^3,也是最直接最暴力的方法,结果也是可以得到。但是,看图

看一下详细情况:

超出时间限制,也就是时间复杂度太大了,不能通过。那我就再想想能不能有什么减少复杂度的方法
3. 过程2:
代码:
class Solution(object):
def maxArea(self, height):
max_v = 0
for i, row in enumerate(height):
for j, col in enumerate(height):
_min = row if row < col else col
if (j-i)*_min > max_v:
max_v = (j-i)*_min
return max_v
时间复杂度O(n)=n^2,但是结果还是不能通过。之后我又想了一些方法,但是还是不行,最后只得求助了,但是leetcode是这样的,如果你没有一次通过的话,那你就看不到别人提交的范例。按理说这些题目拿去Google一下,肯定会有结果的,其实还可以去这个网站LintCode解题,
然后将这一道题的题目放上去搜索就会有答案了,注意要用英文的题目。选择箭头所指就可以显示python的解答方法。

那个代码长这样:

我直接拿去运行了一下,通过了。但是效果并不好,运行结果如下:
后来我看了一下最优解法的代码,结果竟然只是在这个基础上改了一点点,而时间效果竟差了很多。最优解的代码如下:

你没看错,就是把上面的那个代码中的ans = max(ans, area)这段代码改成用条件判断语句,舍弃了python自带的max()方法竟然可以提升这么大。对了,这一段代码的执行结果如下:

时间从156ms,变到了72ms,不可思议,但是从这儿我又发现了一个问题。上面最优解的那个执行时间是52ms,而我用同样的代码去提交,时间还是72ms,我想执行时间应该还和电脑配置有关吧。