题目描述
盛最多水的容器
这里有两种方法去实现
1、暴力法,遍历两两边然后取边较小的一边乘以坐标差,就是围成的面积,不断更新就行(这里有两个指标,
不仅要考虑边的高度,还要考虑坐标差的影响。)
提交结果:不通过,因为超过时间限制(小看了中等难度的题)。
2、动态规划,看了下评论,说使用双指针的思想。
由于面积=坐标差*高,如果缩小坐标,意味着保留高度更大的一边,(言简意赅,果然精髓无需多说)
以下为java实现
public int maxArea(int[] height) {
int maxarea=0;
int minh=0;
for(int i=0,j=height.length-1;i<j;)
{
minh=height[i]<height[j]?height[i++]:height[j--];
if(maxarea<minh*(j-i+1))
{
maxarea=minh*(j-i+1);
}
}
return maxarea;
}
其实后面一个if也可以用minh那里的表达式来取最大值,但是加了判断之后就不用每一步都去算,所以会提升一点时间。
提交通过,以下为评估结果。
而后使用python进行实现。
def maxArea(self, height):
"""
:type height: List[int]
:rtype: int
"""
j = len(height) - 1
i = 0
area = 0
while i < j:
if height[i] < height[j]:
minh= height[i]
i=i+1
else:
minh= height[j]
j=j-1
if area < minh * (j-i+1):
area = minh * (j-i+1)
return area
以下为评估结果:
对比java和python,发现Java是内存消耗比较大,但是速度比较快,而python是用时间换内存。可能也有一点就是,自己的优化方案没做到位。
不积硅步,无以至千里;不积小流,无以成江海。共勉。