美文网首页程序员
力扣 11 盛最多水的容器

力扣 11 盛最多水的容器

作者: zhaojinhui | 来源:发表于2020-04-28 09:28 被阅读0次

    题意:给定一个数组,每一个元素代表容器壁的高度,两个元素的间距代表容器的宽度,找出两个数能组成成最多水的容器
    比如:[1,5,1,4],当容器壁为5和4时盛水最多,最多的盛水为:Math.max(5, 4) * (3-1)= 6,其中3和1是4和5在数组中的索引

    思路:

    1. 在数组的开始和结尾各设置一个指针;
    2. 指向数值较小的一边优先开始移动;
    3. 移动开始前先查看当前盛水是否比目前记录的最大值大,如果大则更新最大值;
    4. 记录开始的指针值;
    5. 移动指针直到找到比开始的值大的新值,因为在移动的过程中,宽度在不断减小,只有当新移动到的容器壁比最开始的容器壁高,才可能会比之前记录的值大;

    思想:首尾指针法

    复杂度:时间O(n),空间O(1)

    class Solution {
        public int maxArea(int[] height) {
            int len = height.length;
            int s = 0;
            int e = len - 1;
            int res = 0;
            while(s<e) {
                if(height[s]<=height[e]) {
                    res = Math.max(height[s] * (e-s), res);
                    int temp = height[s];
                    while(s<e && height[s] <= temp) {
                        s++;
                    }
                } else {
                    res = Math.max(height[e] * (e-s), res);
                    int temp = height[e];
                    while(s<e && height[e] <= temp) {
                        e--;
                    }
                }
            }
            return res;
        }
    }
    

    相关文章

      网友评论

        本文标题:力扣 11 盛最多水的容器

        本文链接:https://www.haomeiwen.com/subject/xgmmwhtx.html