1 前言
示例:
2 实现
2.1 分析
if (height[left] < height[right]) {
left++;
} else {
right--;
}
从题目中我们可以了解到
- 盛水体积的求法:(右边下标 - 左边下标)* min(左边高度,右边高度)。
怎样才能获得最大的体积呢?
- 下标宽度最大
- min(左边高度,右边高度)最大。
2.2 代码
采用双指针法。left = 0 ; right = heigh.length - 1;
left 和right 怎么更新呢?
因为要保证最大值,假如我们 height[right] >height[left] 那么left ++; 每次移动最小高度对应的指针,可以保证盛水体积最大。
if (height[left] < height[right]) {
left++;
} else {
right--;
}
package cn.msf.hot100;
/**
* @author : msf
* @date : 2022/12/10
* 盛水最多的容器。
*/
public class MaxArea {
public static void main(String[] args) {
int[] capacity = {1, 8, 6, 2, 5, 4, 8, 3, 7};
int result = new MaxArea().maxArea(capacity);
System.out.println("选的容器最大能存" + result + "升水");
}
public int maxArea(int[] height) {
int left = 0;
int right = height.length - 1;
int result = 0;
while (left < right) {
int capacity = Math.min(height[left], height[right]) * (right - left);
result = Math.max(capacity, result);
if (height[left] < height[right]) {
left++;
} else {
right--;
}
}
return result;
}
}
上述代码执行结果如下: