首页 > 其他分享 >力扣 leetcode 11. 盛最多水的容器

力扣 leetcode 11. 盛最多水的容器

时间:2022-12-03 13:23:44浏览次数:46  
标签:11 volume 遍历 maxRight int height 力扣 maxVolume leetcode

问题描述

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0)(i, height[i])

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

提示:

  • n == height.length
  • 2 <= n <= 10^5
  • 0 <= height[i] <= 10^4

示例

示例1:

输入:[1,8,6,2,5,4,8,3,7]
输出:49 
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例 2:

输入:height = [1,1]
输出:1

解题思路

这里最简单的思路就是双重遍历数组,计算每两条边作为容器时的容量,然后找出最大值即可。但是这样的做法太复杂,可以进行优化。我们在双重遍历的时候,外面的循环从左往右遍历,里面的循环从右往左遍历,并且分别记录左右两边的最大值,如果从左往右遍历时,发现新的边小于最大值,说明该边组成的容器的容量不可能是最大的。代码如下:

class Solution {
public:
    int maxArea(vector<int>& height) {
        int maxVolume = 0;
        int volume = 0;
        int width = 0;
        int maxLeft = 0;
        int maxRight = 0;
        for(int i = 0; i < height.size(); i++){
            if(maxLeft < height[i]){
                maxLeft = height[i];
            }
            else{
                continue;
            }
            width = height.size() - i - 1;
            maxRight = 0;
            for(int j = height.size() - 1; j > i; j--){
                if(maxRight < height[j]){
                    maxRight = height[j];
                    volume = (width--) * (height[i] < height[j] ? height[i] : height[j]);
                    if(maxVolume < volume){
                        maxVolume = volume;
                    }
                }
                else{
                    width--;
                    continue;
                }
            }
        }
        return maxVolume;
    }
};

然而,上述代码还是太过复杂,时间复杂度仍然是 O(N^2) ,是否可以再进行简化呢?

答案是可以。实际上我们不需要使用双重循环,只需要使用双指针,遍历一次数组即可。我们令指针 i 指向数组的左边, j 指向数组的右边。计算此时 ij 所在边作为容器时的容量,并比较 ij 所指向边的长短。如果 height[i] < height[j] ,则将 i 向后移动; 如果 height[j] < height[i] ,则将 j 向前移动。

让我们分析一下这么做的原因。先看第一种情况,height[i] < height[j] ,计算此时的容积为 v1 = (j - i) * (height[i]) 。此时,如果继续保持 i 不变, j 向前移动,记作 j' ,那么无论 height[j'] 取值多少,得到的容积都不大于 v2 = (j' - i) * (height[i]) ,由于 j' < j ,因此 v1 > v2 成立。

另外一种情况也类似,当 height[j] < height[i] 时, 若 j 不变, i 移动, 得到的结果也不可能大于先前的结果。

因此,这个问题我们可以简化为只移动 ij ,对 height 数组进行一次遍历。同时,为了减小遍历次数,我们也可能让 ij 每次移动后,都保证新的边长度比原来的边长度更长,即 height[i'] > height[i]height[j'] > height[j]

class Solution {
public:
    int maxArea(vector<int>& height) {
        int maxVolume = 0;
        int volume = 0;
        int maxLeft = 0;
        int maxRight = 0;
        int i = 0;
        int j = height.size() - 1;
        while(i < j){
            if(height[i] < height[j]){
                volume = (j - i) * height[i];
                maxLeft = height[i];
                while(height[++i] < maxLeft);
            }
            else{
                volume = (j - i) * height[j];
                maxRight = height[j];
                while(height[--j] < maxRight);
            }
            if(maxVolume < volume){
                maxVolume = volume;
            }
        }
        return maxVolume;
    }
};

标签:11,volume,遍历,maxRight,int,height,力扣,maxVolume,leetcode
From: https://www.cnblogs.com/greatestchen/p/16946002.html

相关文章

  • 「遍历」字符串中第二大的数字(力扣第1796题)
    本题为12月3日力扣每日一题题目来源:力扣第1796题题目tag:遍历题面题目描述给你一个混合字符串s,请你返回s中第二大的数字,如果不存在第二大的数字,请你返回-1。混合......
  • 解决delphi10安卓app升级delphi11的问题
    解决delphi10安卓app升级delphi11的问题最近看delphi11比较稳定了,就主动安装了新版,但发现原来在delphi10.4.2下开发的安卓应用无法在新版下编译,主要情形如下:Libraries下......
  • win11右下角快捷面板打不开的处理方法
    win11右下角快捷面板打不开的处理方法在搜索中查询计算机管理(因为没有将此电脑放出来,所以就用搜索了)然后找到服务,找到windows推送通知系统服务,右键属性,将自动改为禁用,然......
  • 《XY618 4G 核心板》BOM全国产化,支持安卓11.0操作系统!
       产品概括:《XY6184G核心板》是深圳市新移科技有限公司基于紫光展锐T618(虎贲T618)平台所研发出的一款4G全网通智能模块,搭载了安卓11.0操作系统,BOM全国产化。该模块......
  • leetcode.cn 10.正则表达式匹配 记忆化搜索
    心血来潮想刷刷题玩,想起leetcode,注册登录,知道leetcode上的题都比较简单,就勾选难度为“困难”,然后看到此题。读完题,心想这标为“困难”,该不会是得用DFA甚至NFA吧?又仔细看......
  • 力扣09 判断一个数是否是回文数
    力扣09判断一个数是否是回文数题目:给你一个整数x,如果x是一个回文整数,返回true;否则,返回false。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如......
  • 11.25 闲话
    今天去了师大附中。好难过,很感慨,回家路上想了很多。想了想还是明天结束后再写吧,有空补个回忆录。来更新了。去试机的路上和jzp坐在一起看b站,不免感叹时光飞逝,两年......
  • 【2022-11-26】今日计划
    20:00天地间惟谦谨是载福之道,骄则满,满则倾矣。凡动口动笔,厌人之俗,嫌人之鄙,议人之短,发人之覆,皆骄也。无论所指未必果当,即使一一切当,已为天道所不许。      ......
  • 【2022-11-27】裸婚动力
    20:00一切福田,不离方寸;从心而觅,感无不通。                                       ......
  • 力扣 leetcode 986. 区间列表的交集
    问题描述给定两个由一些闭区间组成的列表,firstList和secondList,其中firstList[i]=[starti,endi]而secondList[j]=[startj,endj]。每个区间列表都是成对不......