栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

11. 盛最多水的容器

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

11. 盛最多水的容器

11. 盛最多水的容器

首先想到的就是暴力算法,遍历整个二维数组,将i与i-1…i-n依次求值,求得最大值。此算法时间复杂度为O(n^2),空间复杂度为O(1)。

那么有没有办法降低时间复杂度呢?

这个题如果第一次做,想不到解法很正常,只能靠一些过去的刷题经验,即这样的数组问题通常使用双指针解决。

class Solution {
    public int maxArea(int[] height) {
        int result = 0;
        int left = 0;
        int right = height.length-1;
        while (left < right) {
            int h = Math.min(height[left], height[right]);
            int area = (right-left)*h;
            result = Math.max(result, area);
            if (height[left] > height[right]) {
                right--;
            } else {
                left++;
            }
        }
        return result;
    }
}

算法思想是这样的,定义left、right两个指针,从数组的两端往中间收缩,面积计算完成后,总是移动高度较低的那个指针。

我最开始想不明白为什么是移动高度较低的那个指针?这里我们假设height[left] < height[right]

因为area = Min(h[right], h[left]) * (right - left),如果我们移动right,接下来新容器的底变小了,且新容器的高h’< h[left](因为高度取决于最小高度),那么必然不可能找到比当前更大的面积。所以我们只能移动高度角度的那个指针,这样才有可能在底变小的同时,或许能够找到比h[right]更大的h[right]'以抵消底变小的面积损失。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/338399.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号