0
点赞
收藏
分享

微信扫一扫

双指针算法---最大面积

/**
* 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
*
* 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
*
* 返回容器可以储存的最大水量。
*
* 说明:你不能倾斜容器。
*
* 输入:[1,8,6,2,5,4,8,3,7]
* 输出:49
* 解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
*
* 输入:height = [1,1]
* 输出:1
*/
public class AreaMax_11 {

public static void main(String[] args) {
int[] height = {1,8,6,2,5,4,8,3,7};
System.out.println(maxArea1(height));
}

/**
* 暴力解法 容易超时
* @param height
* @return
*/
public static int maxArea(int[] height) {
int res = 0;
int weight = 0;
int max = 0;

while (weight < height.length){
for (int i = weight + 1; i < height.length; i++) {
if (height[weight] < height[i]){
res = height[weight] * (i - weight);
}else {
res = height[i] * (i - weight);
}
max = Math.max(res, max);
}
weight++;
}
return max;
}

// 优化面积公式为s(i,j) = min(h[i],h[j]) * (j-i)
public static int maxArea1(int[] height) {
int i = 0;
int j = height.length - 1;
int s = 0;
int max = 0;

while (i < j){
if (height[i] <= height[j]){
s = Math.min(height[i], height[j]) * (j - i);
max = Math.max(s, max);
i++;
}else {
s = Math.min(height[i], height[j]) * (j - i);
j--;
max = Math.max(s, max);
}
}
return max;
}
}

注意:解释第二个优化的方法:由于面积的高是由短板决定的,所以长板向移动的时候高不变,底变小,面积变小。反之,短板移动的时候可能使高增加,底变小,所以面积可能增加可能减小。所以每次只移动短板即可根据面积公式计算出最大面积。

举报

相关推荐

0 条评论