package main.java.demo11;
import org.junit.Test;
/**
* 给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
* <p>
* 说明:你不能倾斜容器。
* <p>
* 来源:力扣(LeetCode)
* 链接:https://leetcode-cn.com/problems/container-with-most-water
* 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
*/
public class MaxArea {
/**
* 解题思路: 这题使用双指针方法, 当左右指针指向的height中较小的不可能在以后成为容器的边界, 这时就要把左指针剔除
* 我们不妨假设 leftPoint 和 rightPoint 分别为左右指针且 height[leftPoint] < height[rightPoint]
* 这时 容积为 (rightPoint - leftPoint) * height[leftPoint]
* 如果这时不移动左指针, 而是移动右指针, 把左指针当作容器的边界, 以后的容积一定小于上面的容积,你想一想就知道了
* @param height
* @return
*/
public int maxArea_1(int[] height) {
// 定义左右指针
int leftPoint = 0;
int rightPoint = height.length - 1;
int result = 0;
while (rightPoint > leftPoint) {
result = Math.max(result, (rightPoint - leftPoint) * Math.min(height[leftPoint], height[rightPoint]));
if (height[rightPoint] > height[leftPoint]) {
leftPoint++;
} else {
rightPoint--;
}
}
return result;
}
@Test
public void maxAreaTest() {
System.out.println(maxArea_1(new int[]{1,8,6,2,5,4,8,3,7}));
}
}
容器最大容积的双指针解法
最新推荐文章于 2024-07-25 18:03:40 发布