当前位置 : 主页 > 编程语言 > java >

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

来源:互联网 收集:自由互联 发布时间:2023-02-04
/** * 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 * * 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 * * 返
/** * 给定一个长度为 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; }}

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

网友评论