题目
解析
- 这道题就是给你个一维数组,然后数组的索引表示位置,数组的值表示高,然后根据 尾索引 - 首索引 得到底,然后 底 * 高 得到水的面积,然后求这组数据中最大的值
- 知道具体题意之后,这题怎么解呢?
- 首先一个最简单的方法,就是暴力解法,把所有的结果求出来,两个for循环,从第一索引开始,第一遍先遍历全部数组的值,求出最大值,第二遍从第二个索引开始遍历,一次类推,这样就能得到一个最大的值。
- 上面的方法太简单了,所以就不做代码展示了,主要是要讲解下面一个方法,双指针法。
- 这道题我一看就知道是双指针,不过一开始我想的是一前一后地双指针,遇到一些特殊的情况得到的答案不对。后来我想了一下,应该前后双指针,具体怎么做,我下面讲解
双指针解法
- 首先,我们创建两个指针,分别指向 1 和 7,这样我们就可以算他们的面面积了,1 * (8-0) = 8
- 好计算完了,然后重点是接下来怎么变动,指针怎么动可以使得面积最大,按照贪心的思想肯定是 值小的往前走,因为如果你把大的往前走,底只会减一,但值可能小的很多,如果值小的走,就是按照找最大的思路走。所以我们让left指针往前走。
- 计算出来的面积是 7 *(8-1)= 49 ,进行比对,发现7比8小,所以7往前一步
- 以此类推,最后发现最大值只能是49,所以得出答案
- 代码如下:
class Solution {
public int maxArea(int[] height) {
int res = 0;
int left = 0;
int right = height.length - 1;
while (left < right && right > 0) {
int x = right - left;
int y = Math.min(height[right], height[left]);
res = Math.max(res, x*y);
if (height[left] < height[right]) {
left ++;
}else {
right --;
}
}
return res;
}
}