Given n non-negative integers a1, a2, ..., an , where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.
Note: You may not slant the container and n is at least 2.
方法一:又是暴力解法
还是循环套循环,找到比这个数大,但又离他最远的点。然后再计算如何面积最大。
时间复杂度O(n^2),空间复杂度O(n)
class Solution {
public int maxArea(int[] height) {
int[] tmp = new int[height.length];
for (int i = 0; i < height.length; i++){
int max_tmp = 0;
for (int j = 0; j < height.length; j++){
if (height[j] >= height[i] && Math.abs(i-j) >= max_tmp){
max_tmp = Math.abs(i-j);
}
}
tmp[i] = max_tmp;
}
int area_tmp = 0;
for (int i = 0; i < height.length; i++){
if (tmp[i]*height[i] >= area_tmp){
area_tmp = tmp[i]*height[i];
}
}
return area_tmp;
}
}
方法二、稍微简单一些的暴力解法
没想到我的上述解法确实太傻了,果然solution的暴力解法都比我优越一些。
时间复杂度O(n^2),空间复杂度O(1)
public class Solution {
public int maxArea(int[] height) {
int maxarea = 0;
for (int i = 0; i < height.length; i++)
for (int j = i + 1; j < height.length; j++)
maxarea = Math.max(maxarea, Math.min(height[i], height[j]) * (j - i));
return maxarea;
}
}
方法三、我们选择两个点,一个点是第一个,一个是最后一个。然后我们开始移动这两个点,试图找到最大的面积。
在移动这两个点的时候,最重要的一个策略是,把值较小的那个点往里移。比较intuitive的想法是,把大的点往里移一点好处都没有,因为会把width减少,但是length还是保持不变(因为面积的大小受制于值较小的那个点)。而把小的往里移有可能是面积扩大。
class Solution {
public int maxArea(int[] height) {
int start = 0;
int end = height.length-1;
int maxarea = 0;
while(start<end){
int width = end-start;
maxarea = Math.max(maxarea, width* Math.min(height[start],height[end]));
if(height[start]>height[end]){
end--;
}
else{
start++;
}
}
return maxarea;
}
}