一、题目描述

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

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

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

说明:你不能倾斜容器。

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

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

二、代码思路

分析题目,我们知道题目的意思是让我们求出两条棒子围出的最大面积,围出的面积是由短杆的高度乘与底边长得到的,也就是:

int area = (right - left) * Math.min(height[left], height[right]);

有两种解题方法

2.1 暴力题解

上面已经解释过了,目的是计算两条杠围成的最大面积,那么我们枚举出所有两条杠的组合即可。

2.2 双指针

上述的暴力题解,时间复杂度较高,题目要求n<10^5, on2的时间复杂度显然会超时的。所以想想优化的解法,题目中提到了左右两条杠组成的面积,所以我们可以考虑到双指针的解题思路。

但是问题的难点是双指针如何移动,我们考虑题目的要求,要求面积最大,面积是由左右杠高度以及左右杠之间的距离决定的,所以,移动规则如下:

  • 如果left杠高度大于right杠那么移动right杠,也就是移动高度低的。
  • 如果两条杠高度一致移动任意一个。
  • 如果移动的时候发现相邻的杠高度比自身高度还低,那么不用计算其围成的面积。(因为底边长度度变少了,高度也变少了,那么面积必然也会变少)

那么如何证明我们移动的是正确的呢?

如果left杠高度大于right杠那么移动right杠,也就是移动高度低的。为什么移动高度低的? 计算面积的时候是由高度低的决定的面积,如果不移动它,那么面积会一直受到其限制,这样造成的结果就是底边越来越短,高度不变,或者高度变得更低。所以,移动高度高的我们的面积只会越来越短,从而做一些没必要的计算,只有移动高度低的才有可能出现面积更大的元素。

考虑第一步,假设当前左指针和右指针指向的数分别为 x 和 y,不失一般性,我们假设 x≤y。同时,两个指针之间的距离为 t。那么,它们组成的容器的容量为:

min⁡(x,y)∗t=x∗t

我们可以断定,如果我们保持左指针的位置不变,那么无论右指针在哪里,这个容器的容量都不会超过 x∗tx * tx∗t 了。注意这里右指针只能向左移动,因为 我们考虑的是第一步,也就是 指针还指向数组的左右边界的时候。

详细题解:https://leetcode.cn/problems/container-with-most-water/solutions/207215/sheng-zui-duo-shui-de-rong-qi-by-leetcode-solution/

三、代码题解

package leetcode.lc20221204;/** @author lzy* @version 1.0* @DESC 乘最多水的容器* */
class Solution01 {public static void main(String[] args) {}//思路1 :暴力解决//时间复杂度:o(n2) 2 <= n <= 10^5 会超时//空间复杂度:o1public int maxArea1(int[] height) {int res = 0;//边界值处理int length = height.length;if (length == 2) {return length * Math.min(height[0], height[1]);}//处理其他值,枚举出任意两根棒子组成的面积for (int i = 0; i < length; i++) {for (int j = i + 1; j < length; j++) {int area = (j - i) * Math.min(height[i],height[j]);res = area > res ? area : res;}}return res;}//思路2:双指针问题public int maxArea(int[] height) {int res = 0;//边界值处理int length = height.length;if (length == 2) {return length * Math.min(height[0], height[1]);}int left = 0;int right = length - 1;while (left < right) {int area = (right - left) * Math.min(height[left], height[right]);res = area > res ? area : res;if (height[left] > height[right]) {right--;} else {left++;}}return res;}
}

【leetcode】 盛最多水的容器相关推荐

  1. leetcode最小面积_每日一道 LeetCode (51):盛最多水的容器

    ❝ 每天 3 分钟,走上算法的逆袭之路. ❞ 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub:https://github.com/meteor1993/LeetCode Gi ...

  2. [贪心|双指针] leetcode 11 盛最多水的容器

    [贪心|双指针] leetcode 11 盛最多水的容器 1.题目 题目链接 给你 n 个非负整数 a1,a2,-,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 ...

  3. LeetCode.M11.盛最多水的容器

    LeetCode.M11 题目: 题目大意: ​ 如图所示. 数据范围: 如图所示 思路: ​ 采用双指针,所容纳的水为min(h[l], h[r]) * (r - l) ,初始时l = 0,r = ...

  4. leetcode系列-11.盛最多水的容器

    leetcode系列–第11题.盛最多水的容器 给定一个长度为 n 的整数数组 height .有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) .找出其中的两 ...

  5. 算法leetcode|11. 盛最多水的容器(rust重拳出击)

    文章目录 11. 盛最多水的容器: 样例 1: 样例 2: 提示: 原题传送门: 分析 题解 rust go c++ java typescript python 11. 盛最多水的容器: 给定一个长 ...

  6. 每日一道 LeetCode (51):盛最多水的容器

    每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...

  7. 【LeetCode】1. 盛最多水的容器:C#三种解法

    题目:https://leetcode-cn.com/problems/container-with-most-water/ 盛最多水的容器 难度:中等 给你 n 个非负整数 a1,a2,...,an ...

  8. LeetCode 11. 盛最多水的容器

    11. 盛最多水的容器 思路:双指针,放弃低的那边 class Solution { public:int maxArea(vector<int>& height) {int n= ...

  9. 20200120:(leetcode)盛最多水的容器 两种解法

    盛最多水的容器 题目 基本思路 代码实现 题目 给定 n 个非负整数 a1,a2,-,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ...

  10. 算法题解(Leetcode 11、15、17、19、20:盛最多水的容器、三数之和、电话号码的字母组合、删除链表的倒数第 N 个结点、有效的括号)

    文章目录 [11. 盛最多水的容器 - 中等 - 9/7](https://leetcode-cn.com/problems/container-with-most-water/) [15. 三数之和 ...

最新文章

  1. Java过滤特殊字符的正则表达式
  2. 学习笔记Hive(一)—— Hive简介
  3. 三菱st语言编程实例_LD、FBD、IL、ST、SFC、CFC六种编程语言的特点
  4. Java笔记-使用RabbitMQ的Java接口实现topic(主题模式)
  5. 最新、最前沿AI论文哪里找?
  6. 关于OpenCV的那些事——相机姿态更新
  7. 十二月无书稿,总个结(2011)
  8. UVALive4983 UVa1593 POJ3959 Alignment of Code【字符串流+输入输出】
  9. python空行拼接字符串_在python中的每一个空行插入一个新的行字符串
  10. 力扣--8字符串转换整数 (atoi)
  11. 毕业了5年的同学突然告诉我,他已经是架构师了!
  12. 世界上第一部智能手机27岁了
  13. drupal与html转换,HTML转Drupal主题的方法
  14. 十六进制表示法(二进制/十六进制/十进制之间的转换)
  15. 主机内存测试软件,检测内存条的软件有哪些?内存条查看工具介绍
  16. 浅析游戏中的打击感如何实现
  17. 原生js实现运维小姐姐的九宫格抽奖活动、心跳快了
  18. 明日之后找回原来的服务器,明日之后怎么找回原来的账号
  19. Microsoft Platform SDK Febrary 2003下载(更新VC6的SDK)
  20. 各大券商提供的量化终端怎么样?

热门文章

  1. [转载] 七龙珠第一部——第028话 力量的激斗
  2. myeclipse5.1GA下WebService开发日记(2)
  3. Andrew Stankevich Contest 46 [Solo]
  4. MATLAB 循环保存.mat文件
  5. Android 修改Hosts
  6. 行人检测算法评估标准
  7. cpu 中控制单元执行的任务分析
  8. SOA与BPM的融合
  9. HHVM 4.2 发布,加速计划释出的第一个版本
  10. 教师精彩课堂用语10句