双指针法如何应用于求解最大矩形面积问题?
- 内容介绍
- 文章标签
- 相关推荐
本文共计503个文字,预计阅读时间需要3分钟。
pythondef maxWater(height): n=len(height) left=0 right=n - 1 max_water=0
while left
return max_water
/** * 给定一个长度为 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; }}注意:解释第二个优化的方法:由于面积的高是由短板决定的,所以长板向移动的时候高不变,底变小,面积变小。反之,短板移动的时候可能使高增加,底变小,所以面积可能增加可能减小。所以每次只移动短板即可根据面积公式计算出最大面积。
本文共计503个文字,预计阅读时间需要3分钟。
pythondef maxWater(height): n=len(height) left=0 right=n - 1 max_water=0
while left
return max_water
/** * 给定一个长度为 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; }}注意:解释第二个优化的方法:由于面积的高是由短板决定的,所以长板向移动的时候高不变,底变小,面积变小。反之,短板移动的时候可能使高增加,底变小,所以面积可能增加可能减小。所以每次只移动短板即可根据面积公式计算出最大面积。

