leetcode–container_with_most_water
题意:给定n个非负整数a1,a2,…,an,其中每个表示在坐标(i,ai)的一个点。 有n条垂直绘制的线,使得线的两个端点i是在(i,ai)和(i,0)。找到两条线,其与X轴一起形成了一个容器,使得所述容器包含最多的水。
分析:本题比较简单,采用动态规划方法求解,递推公式为
x(i)=max(x(i−1),max(min(aj,ai)∗(i−j))(0≤j<i)
,
x(i)
表示前i个line能包含最多的水,该递推式时间复杂度是
O(n2)
。(好像还有更简单的方法,我也没仔细想)
代码:用的迭代而非递归(怕栈溢出)
public int maxArea(int[] height){
int length = height.length;
if(length == 0){ //如果height没有值,返回面积最大为0
return 0;
}else if(length == 1){ //如果height只有一个值,返回最大面积为0
return 0;
}else{ //如果height有两个及以上的值
int result_max = Math.min(height[0], height[1]); //最终返回的结果
for(int i=2; i < length; i++){
int temp_max = 0; //用于保存嵌套循环中的最大值
for(int j = 0; j < i; j++){
int temp = Math.min(height[j], height[i])*(i - j);
if(temp > temp_max){
temp_max = temp;
}
}
if(temp_max > result_max){
result_max = temp_max;
}
}
return result_max;
}
}