01

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

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

分析:maxs = max( min( h(i), h(j) ) * (j - i) ) ,最直接的思路是依次遍历每条边,然后求与其后面的每条边组成的容器的最大面积。求解复杂度O(n^2).

有没有优化的可能?

要想优化,就要找出那些重复或不必要的操作,比如容器一条边为最左侧边时,如果它再小于最右侧边,此时绝无必要再挨个尝试其他边了。同理,如果容器一条边为最右侧时,如果它再小于最左侧边,也没必要遍历其他边。同时保证也能遍历到所有的组合。嗯,该怎么做呢?

最大面积无非就是长乘以高,如果长和高都是最大值,那么乘积当然是最大值,当然还有很多情况不是这样,不过,自然地,可以这么尝试,首先保证x轴方向的最大值,要想做到这个,并不难,我们可以用两个指针分别指向最左(用i表示)或最右(用j表示),这样它们的差值就是长度的最大值,那么此时的高度就是 min(h(i),h(j)), 我们当然希望min(h(i),h(j))这个值尽可能地大,也就是 max( min(h(i),h(j) ) ),

那么如何操作,才能找到这个因子的尽可能大的最大值呢?

如果h(i)更小,既然它更小,要想取得再大的值,可以允许 i自增1,也就是判断 h(i++)的大小,重新获得一种更可能高的可能。同理,如果h(j)更小,j自减1,判断 h(j--),求其与 h(i) 的较小值,分析到这里,已经走了一大步,不过我们担心的是陷入局部最优解,

这种方式要想保证全局最优,如何做到?

设定变量 res 表示当前的全局最优解,如果下一步求出的解,也就是 (j-i) * min(h(i),h(j)),与 res 比较,选取两者较大值,并重新赋值给 res,这样始终保证 res 为全局最优解。

02
完整代码
class Solution:def maxArea(self, height: List[int]) -> int:i, j, res = 0, len(height) - 1, 0while i < j:if height[i] < height[j]:res = max(res, height[i] * (j - i))i += 1else:res = max(res, height[j] * (j - i))j -= 1return res

03
完整过程,请注意以下各图中res = min(res, S(()) , 应该将min修改为max.

图片参考:
https://leetcode-cn.com/problems/container-with-most-water/solution/container-with-most-water-shuang-zhi-zhen-fa-yi-do/

推荐阅读

算法工程师来做数据分析,会闹出哪三个笑话?
Python与算法社区
长按二维码,关注我的公众号

画解算法:盛最多水的容器 | 腾讯面试编程50题(二)相关推荐

  1. 11. 盛最多水的容器 golang

    11. 盛最多水的容器 (一道比较特殊的题) 之所以说特殊是因为这个题用动态规划反而比暴力破解法还复杂. 这种容器的题,就是前后指针方向.尽量别考虑别的思路. 11. 盛最多水的容器 给你 n 个非负 ...

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

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

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

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

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

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

  5. 漫画:腾讯面试题(盛最多水的容器)

    来自:小浩算法 01 PART 盛最多水的容器 这道题目会了的朋友可能觉得很简单,但是我觉得这题实在很经典,所以还是得拿出来讲讲.还有一个进阶版本"接雨水",将在后面为大家讲解. ...

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

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

  7. [Leedcode][JAVA][第11题][盛最多水的容器][双指针][贪心]

    [问题描述]11.盛最多水的容器 给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 ...

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

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

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

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

最新文章

  1. Android中View绘制流程以及invalidate()等相关方法分析
  2. plsqlfor循环输出三角形_glium指南-03-移动我们的三角形
  3. linux搭建lnnp_linux主机安装lnmp详细步骤
  4. React开发(101):样式处理
  5. Developmental Cell | 人类视网膜发育过程中的重要分子机制
  6. 为什么html运行之后不滚动,为什么很多移动端的HTML UI,在滚动时都用transform属性而不是用传统的滚动条?...
  7. BGP——同步功能【Synchronization】【路由黑洞】
  8. 秋风秋雨愁煞人:寒宵独坐心如捣
  9. Mysql学习总结(15)——Mysql错误码大全
  10. 利用两数之和实现两个数交换(java版本)
  11. java集合for循环_详解Java中list,set,map的遍历与增强for循环
  12. android中jni数据加密,Android jni字符串如何加密
  13. 产品经理的第二本书_笔记
  14. Kaggle TMDB 票房预测挑战赛
  15. AI实战:文本自动摘要简述
  16. 嵌入式FCT项目案例分享(STM32)
  17. c# cad中插入另一个dwg的图块
  18. 光纤软件测试,20m光纤速度怎么测试 20m光纤速度测试方法【详解】
  19. 【Android每日一讲】2012.11.27 向左或向右 - RadioGroup组与onCheckedChanged事件
  20. JAVA怎么产生一个随机数

热门文章

  1. android 屏幕录制方案,ShareREC for Android全系统录屏原理解析
  2. 怎么删除多余的启动项
  3. 手绘线条一直画不直_视频教程 | 绘画小白福音,曲线画不准、直线画不直?来,我教你...
  4. c++入门之内联函数,auto关键字
  5. C语言:有一函数y= x(x<1) 2x-1 (1≤x<10) 3x-11 (x≥10)用 scanf 函数输入 x 的值,求 y 值。
  6. 大学JAVA课堂笔记
  7. 浅谈高速公路服务区分布式光伏并网发电-Susie 周
  8. Centos中安装docker并查看拉取镜像的位置
  9. Hibernate Envers
  10. 看懂《C程序设计(第五版)学习辅导》第16章中介绍的用Visual Studio 2010对C程序进行编辑、编译、连接和运行的方法,并进行以下操作