练营第19天休息日|11. 盛最多水的容器

代码随想录训练营第19天休息日|11. 盛最多水的容器


)

11.盛最多水的容器

思路

本来想的是维护两个队列,一个是从左到右升序,一个是从右到左升序,然后二层遍历,计算最大容量。
但是耗时非常久。
看完题解,发现题解用的是双指针,每次缩较低侧的窗口。

代码

// 双指针
class Solution {
    public int maxArea(int[] height) {
        int i, j;
        int upper = 0;
        i = 0;
        j = height.length - 1;
        while (i < j) {
            upper = Math.max(upper, (j - i) * Math.min(height[i], height[j]));
            if (height[i] < height[j]) {
                ++i;
            } else{ //} if (height[i] > height[j]) {
                --j;
            } 
        }
        return upper;
    }
}

// 双队列
class Solution {
    public int maxArea(int[] height) {
        LinkedList<Integer> queue_r = new LinkedList<>();
        LinkedList<Integer> queue_l = new LinkedList<>();
        int i, n;
        int upper = 0;
        n = height.length;
        for (i = 0; i < n; ++i) {
            if (queue_l.isEmpty() || height[queue_l.getLast()] < height[i]){
                queue_l.offer(i);
            }
            if (queue_r.isEmpty() || height[queue_r.getLast()] < height[n - i - 1]) {
                queue_r.offer(n - i - 1);
            }
        }
        for (Integer left: queue_l) {
            for (Integer right: queue_r){
                if (left >= right) {
                    break;
                }
                upper = Math.max(upper, (right - left) * Math.min(height[left], height[right]));
            }
        }
        return upper;
    }
}

总结

你问我为什么不写一个在双队列里用双指针
哈哈哈,我不去
上表司令官但是不许

算了不玩月光梗,老老实实写在这了好了

class Solution {
    public int maxArea(int[] height) {
        LinkedList<Integer> queue_r = new LinkedList<>();
        LinkedList<Integer> queue_l = new LinkedList<>();
        int i, n;
        int upper = 0;
        n = height.length;
        for (i = 0; i < n; ++i) {
            if (queue_l.isEmpty() || height[queue_l.getLast()] < height[i]){
                queue_l.offer(i);
            }
            if (queue_r.isEmpty() || height[queue_r.getLast()] < height[n - i - 1]) {
                queue_r.offer(n - i - 1);
            }
        }
        Integer left = queue_l.poll();
        Integer right = queue_r.poll();
        while (left != null && right != null && left < right) {
            upper = Math.max(upper, (right- left) * Math.min(height[left], height[right]));
            if (height[left] < height[right]) {
                left = queue_l.poll();
            } else {
                right = queue_r.poll();
            }
        }
        return upper;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值