解法都在代码里,不懂就留言或者私信
class Solution {
/**题目使用双指针法求解,指针left指向0位置,指针right指向N-1位置
每次比较left和right,谁小结算谁的水量(以对方为对侧最大值),结算完每个位置的水量
答案必在其中 */
public int maxArea(int[] height) {
if(height.length == 2) {
/**如果只有两根柱子,二者的距离是1,高度是二者中较小的那个 */
return Math.min(height[0], height[1]);
}
int ans = 0;
int left = 0;
int right = height.length - 1;
while(left < right) {
/**左边小结算左边的 ,右边小结算右边的,我们每一步求的是以这个较小的值为高能扩出的矩形最远能到多远(比如左边的往右找大于它的最右边在哪里
因为高固定的情况下,宽度越宽面积越大)
* 这里也可以写成if(arr[left] >= arr[right]) {
* ans = Math.max(ans, arr[right] * (right - left + 1))
* right --
* } else {
* ans = Math.max(ans, arr[left] * (right - left + 1))
* left ++;
* }
* 装习惯了,改不过来了
* 这里整体的意思就是谁小结算谁的水量
* 为啥谁小结算谁的水量呢? 例如left比较小,那当前的right是大于你最靠右的,以你为最大高度理论上找到越靠右的大于你的越好
* 那right的右边有没有大于left的呢? 恐怕不会有,如果有的话那left遇到它的时候就结算了,为什么会等到right呢,肯定右边没有或者都被left淘汰了
* 所以left~right是以left的高度为最小高度的最宽的范围
* right也同理,以每个点为最低高度算一个值,最大的就是我们要的答案
*/
ans = Math.max(ans, height[left] >= height[right]? height[right--] * (right - left + 1) : height[left++] * (right - left + 1));
}
return ans;
}
}
运行结果还是一般般,过了就行了不追求极致