给定 n 个非负整数 a1, a2, ..., an, 每个数代表了坐标中的一个点 (i, ai)。画 n 条垂直线,使得 i 垂直线的两个端点分别为(i, ai)和(i, 0)。找到两条线,使得其与 x 轴共同构成一个容器,以容纳最多水。
样例
样例 1:
输入: [1, 3, 2]
输出: 2
解释:
选择 a1, a2, 容量为 1 * 1 = 1
选择 a1, a3, 容量为 1 * 2 = 2
选择 a2, a3, 容量为 2 * 1 = 2
样例 2:
输入: [1, 3, 2, 2]
输出: 4
解释:
选择 a1, a2, 容量为 1 * 1 = 1
选择 a1, a3, 容量为 1 * 2 = 2
选择 a1, a4, 容量为 1 * 3 = 3
选择 a2, a3, 容量为 2 * 1 = 2
选择 a2, a4, 容量为 2 * 2 = 4
选择 a3, a4, 容量为 2 * 1 = 2
/**
* @param heights: a vector of integers
* @return: an integer
* 双指针法:
* 解题思路:
* 最左最右两个指针,
* 当左指针的长度 大于 右侧 指针 柱子长度 ,那么右侧指针向左移动
* 反之 同理。
* 把每次移动 (最左最右两个指针距离的长度 * 两个指针较小高度)
* 跟上次的移动进行对比。
* 时间复杂度 = N
*
*
*
*/
public int maxArea(int[] heights) {
int maxWater = 0;
int i = 0;
int j = heights.length -1 ;
while(i < j){//说明
int tempWater = 0;
if (heights[i] < heights[j]) {
tempWater = (j-i)*heights[i];
i++;
}else{
tempWater = (j-i)*heights[j];
j--;
}
if(maxWater < tempWater){
maxWater = tempWater ;
}
}
return maxWater;
}