题目链接
题目简介
给你 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; } }
