11. 盛最多水的容器【中等】

news/2024/11/14 13:13:34/

题目

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

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

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

说明:你不能倾斜容器。

示例 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

提示:

  • n == height.length
  • 2 <= n <= 105
  • 0 <= height[i] <= 104

题解

class Solution {
public:int maxArea(vector<int>& height) {int max = (height.size()-1)*min(height[0],height[height.size()-1]);int left = 0, right = height.size() - 1;while(left<right){if(height[left]<height[right]){left++;if(height[left]>height[left-1] && max < min(height[left], height[right])*(right-left)){max = min(height[left], height[right])*(right-left);}}else{right--;if(height[right] > height[right+1] && max < min(height[left], height[right])*(right-left)){max = min(height[left], height[right])*(right-left);}}}// for(int i=0;i<height.size();i++){//     for(int j=i+1;j<height.size();j++){//         int area = (j-i)*min(height[j],height[i]);//         if( area > max ){//             max = area;//         }//     }// }return max;}
};

笔记

  1. 先试了试暴力法,果然是超时的;
  2. 双指针遍历一遍数组,时间复杂度O(n);
  3. 同样是剪枝判断,对那些确定不会增加容积的行为:比如向内移动长板,不再参与运算。由此分析,就是单边移动。
  4. 关键点就在于:
    • 要确定从两端开始选择,此时底边是最大的,只需在底边变小的趋势下,考虑高度变化;
    • 基于短板效应,只有短边的移动是有意义的;
  5. 底下是精选答案,简洁优雅:
class Solution {
public:int maxArea(vector<int>& height) {int i = 0, j = height.size() - 1, res = 0;while(i < j) {res = height[i] < height[j] ? max(res, (j - i) * height[i++]): max(res, (j - i) * height[j--]); }return res;}
};/*
作者:jyd
链接:https://leetcode.cn/problems/container-with-most-water/solution/container-with-most-water-shuang-zhi-zhen-fa-yi-do/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/

http://www.ppmy.cn/news/83892.html

相关文章

软件研发管理高效的关键:11项自动化功能

1、自动锁定需求缺陷 为了提高用户需求分析质量&#xff0c;尽早发现需求缺陷&#xff0c;CoCode开发云特开发了需求分析工具&#xff0c;使用AI&#xff0c;通过需求测试和一致性检测&#xff0c;能够在几分钟内快速分析用户需求缺陷&#xff0c;如歧义、重复、遗漏、不一致和…

001. 为啥用IDEA反编译没有擦除泛型?

你好&#xff0c;我是YourBatman&#xff1a;一个俗人&#xff0c;贪财好色。 &#x1f4da;前言 Java泛型是进阶高级开发必备技能之一&#xff0c;了解实现泛型的基本原理&#xff0c;有助于写出更优质的代码。 众所周知&#xff0c;Java是伪泛型&#xff0c;是通过类型擦除…

《计算之魂》引子

了解计算机基本原理的读者朋友可以跳过这个引子直接阅读第 1 章&#xff0c;因为本书其他章节并不依赖本章内容。不过&#xff0c;如果你愿意花上半小时读一读这一部分&#xff0c;相信会从数学和哲学层面对计算机以及计算的本质有更深刻的理解。 0.1 什么是计算机 如果你有…

【每日一题Day214】LC1080根到叶路径上的不足节点 | 递归

根到叶路径上的不足节点【LC1080】 给你二叉树的根节点 root 和一个整数 limit &#xff0c;请你同时删除树中所有 不足节点 &#xff0c;并返回最终二叉树的根节点。 假如通过节点 node 的每种可能的 “根-叶” 路径上值的总和全都小于给定的 limit&#xff0c;则该节点被称之…

NumPy

目录 1、NumPy简介 2、利用元组、列表创建多维数组 3、数组索引 4、数组裁切 4.1、一维数组操作 4.2、二维数组操作 5、数据类型 6、副本/视图 7、数组形状 8、数组重塑 9、多维数组的迭代 10、数组连接 10.1、使用concatenate() 函数进行数组连接 10.2、使用堆栈…

开发者关系工程师如何帮助开发者在Sui上构建

近期&#xff0c;我们与Sui开发者关系负责人Brian Hennessey-Hsien进行了对话&#xff0c;就Sui上的开源、去中心化和开发者成就等话题展开讨论。 日前&#xff0c;我们采访了Sui基金会的开发者关系负责人Brian Hennessey-Hsieh&#xff0c;共同探讨了其对于Web3中开发者发展历…

SpringBoot 结合 MyBatis-plus 进行逻辑删除

一 、逻辑删除的概念 逻辑删除不会在数据库中删除数据&#xff0c;只是通过一个字段用来标识被删除的记录&#xff0c;数据仍然保存在数据库中。在实际的工作当中&#xff0c;因为数据非常重要&#xff0c;为了防止因用户误操作删除数据后无法恢复的问题&#xff0c;我们通常不…

Linux系统驱动跟裸机驱动的区别

区别指示 Linux系统驱动和裸机驱动的主要区别在于它们运行的环境和依赖不同。 Linux系统驱动&#xff08;Linux Device Driver&#xff09;&#xff1a; Linux系统驱动是在Linux操作系统环境下运行的。这类驱动通常依赖于Linux内核提供的API和服务&#xff08;如内存管理、任务…