解法都在代码里,不懂就留言或者私信

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;
    }
}

运行结果还是一般般,过了就行了不追求极致

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部