题目链接
题目简介
给你 n
个非负整数 a1,a2,...,an,
每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n
条垂直线,垂直线 i
的两个端点分别为 (i, ai)
和 (i, 0)
。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器。
实例一:
输入:[1,8,6,2,5,4,8,3,7] 输出:49 解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
题目解析
- 简单来说,就是给定两个坐标
i
和j
,让你求Math.,min(height[j], height[i]) * (j - i)
的最大值 - 我们可以使用双指针来做
- 我们可以发现,对于
j - i
始终在缩小的,所以,我们必须要提高下一步的高度
- 我们并不知道下一个高度是大的还是小的,所以,我们可以假设
- 假设
下一个高度
小于当前小的高度
:那么下一个存水的值
取最大
和最小
没有变化 - 假设
下一个高度
大于当前大的高度
:那么下一个存水的值
取最大
大于最小
- 假设
下一个高度
在当前小
和当前大
之间,那么下一个存水的值
取最大
大于最小
- 综上所述,我们每一次移动最短的一方,即可搜索到最大值
题目代码
class Solution { public int maxArea(int[] height) { int left = 0; int right = height.length - 1; int max = 0; while(left <= right){ int sum = Math.min(height[left], height[right]) * (right - left); max = Math.max(max, sum); if(height[left] >= height[right]){ right--; }else{ left++; } } return max; } }