每天 3 分钟,走上算法的逆袭之路。

前文合集

每日一道 LeetCode 前文合集

代码仓库

GitHub:https://github.com/meteor1993/LeetCode

Gitee:https://gitee.com/inwsy/LeetCode

题目:盛最多水的容器

难度:「中等」

题目来源:https://leetcode-cn.com/problems/container-with-most-water/

给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器,且 n 的值至少为 2。


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

示例:

输入:[1,8,6,2,5,4,8,3,7]输出:49

解题思路

今天这道题蛮有意思的,给出一个数组,实际上是在求这个数组之间可以组成的最大面积。

这道题正统的解法是使用双指针,因为是在数组之间灌水,能容纳的水有多少是取决于那个最小的数字,所以我们先把两个指针分别指向数组的头和尾,先求一下当前的面积,然后比较下头尾的大小,每次移动较小的那个指针,把整个数组迭代一遍,取出其中的最大值即可。

public int maxArea(int[] height) {    int len = height.length;    int start = 0, end = len - 1;    int maxArea = 0;    while (start != end) {        int area = Math.min(height[start], height[end]) * (end - start);        maxArea = Math.max(area, maxArea);        if (height[start]             start++;        } else {            end--;        }    }    return maxArea;}

代码看起来不难,声明一点哈,上面这个方案不是我想出来的,是看了答案的提示以后才知道的。

但是这里面有个问题,为什么这种方案是可以找到最大的面积的,难道就不会存在其他的情况么?

下面的这个证明方案同样来自于答案当中,用来证明上面这个方案的正确性。

双指针代表的是可以作为容器边界的所有位置的范围。在一开始,双指针指向数组的左右边界,表示数组中所有的位置都可以作为容器的边界,因为我们还没有进行过任何尝试。

在这之后,我们每次将对应的数字较小的那个指针往另一个指针 方向移动一个位置,就表示我们认为这个指针不可能再作为容器的边界了。

那么为啥这个指针不能在作为容器的边界了,下面是这个问题的证明:

首先考虑第一步,假设当前左指针和右指针指向的数分别为 x 和 y,先假设 x < y ,同时两个指针之间的距离为 t ,那么他们组成的容器的容量为:

min(x, y) * t = x * t

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

我们任意的移动右指针,指向的数字为 y1 ,两个指针之间的距离为 t1 ,那么显然有 t1 < t ,并且 min(x, y1) <= min(x, y)

  • 如果 y1 <= y 那么有 min(x, y1) <= min(x, y)
  • 如果 y1 > y 那么有 min(x, y1) = x <= min(x, y)

因此刚才上面的那个公式可推导:

min(x, y1) * t1 = min(x, y) * t 

即无论我们怎么移动右指针,得到的容器的容量都小于移动前容器的容量。也就是说,这个左指针对应的数不会作为容器的边界了,那么我们就可以丢弃这个位置,将左指针向右移动一个位置,此时新的左指针于原先的右指针之间的左右位置,才可能会作为容器的边界。

这样以来,我们将问题的规模减小了 11,被我们丢弃的那个位置就相当于消失了。此时的左右指针,就指向了一个新的、规模减少了的问题的数组的左右边界,接下来,我们可以重复上面的这个过程,接着缩小容器边界。


感谢阅读

leetcode最小面积_每日一道 LeetCode (51):盛最多水的容器相关推荐

  1. LeetCode刷题(python版)——Topic10盛最多水的容器

    一.题设 给定一个长度为 n 的整数数组 height .有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) . 找出其中的两条线,使得它们与 x 轴共同构成的容 ...

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

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

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

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

  4. 【leetcode】 盛最多水的容器

    一.题目描述 给定一个长度为 n 的整数数组 height .有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) . 找出其中的两条线,使得它们与 x 轴共同构成 ...

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

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

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

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

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

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

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

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

  9. 算法探索_盛最多水的容器

    问题描述: 给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其 ...

最新文章

  1. easyui 报表合并单元格
  2. 曹大带我学 Go(11)—— 从 map 的 extra 字段谈起
  3. 字体外面怎么加边框_有钱人家连电视墙都发“光”,大理石墙周围加一圈镜面边框,华丽...
  4. Nordic Collegiate Programming Contest (NCPC) 2016
  5. 《Python编程从入门到实践》记录之Python函数返回值
  6. 苹果成为存储厂商的新饽饽
  7. “AI+遥感”产品研究现状
  8. Windows应用商店下载安装Ubuntu
  9. 关于php上传多张图片时,选择图片后就可以预览的问题
  10. Apple Lossless Audio Codec 苹果无损音频解码器
  11. JavaScript (递归函数)
  12. PLC、运动控制卡、运动控制器,傻傻分不清
  13. BAT调用服务器的PHP文件时所遇到的问题
  14. ReactiveX 操作符
  15. redis stream 实现消息队列
  16. xp 没有应用程序服务器,XP双击exe文件没反应不能安装程序
  17. 电气器件系列三十:伺服电机
  18. 大数据架构详解电子书全
  19. 头条号三农领域原创视频日赚1000,自媒体领域选择哪个好?
  20. 青蛙有那么蠢吗?(转载)

热门文章

  1. Day3-----delayPrompt
  2. 牛客网-剑指offer 第二题(字符替换)
  3. sylog mysql_25.2 配置使用基于mysql存储日志信息
  4. [python爬虫] BeautifulSoup设置Cookie解决网站拦截并爬取蚂蚁短租
  5. 【数据结构与算法】之深入解析“序列化和反序列化二叉搜索树”的求解思路与算法示例
  6. LeetCode Algorithm 217. 存在重复元素
  7. 95. Unique Binary Search Trees II 不同的二叉搜索树 II
  8. python实现中文字符繁体和简体中文转换
  9. PTA —— 基础编程题目集 —— 编程题 —— 7-1 厘米换算英尺英寸 (15 分)
  10. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1109:开关灯