画解算法:盛最多水的容器 | 腾讯面试编程50题(二)
题目:给定 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 为全局最优解。
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
推荐阅读
画解算法:盛最多水的容器 | 腾讯面试编程50题(二)相关推荐
- 11. 盛最多水的容器 golang
11. 盛最多水的容器 (一道比较特殊的题) 之所以说特殊是因为这个题用动态规划反而比暴力破解法还复杂. 这种容器的题,就是前后指针方向.尽量别考虑别的思路. 11. 盛最多水的容器 给你 n 个非负 ...
- 算法题解(Leetcode 11、15、17、19、20:盛最多水的容器、三数之和、电话号码的字母组合、删除链表的倒数第 N 个结点、有效的括号)
文章目录 [11. 盛最多水的容器 - 中等 - 9/7](https://leetcode-cn.com/problems/container-with-most-water/) [15. 三数之和 ...
- 算法leetcode|11. 盛最多水的容器(rust重拳出击)
文章目录 11. 盛最多水的容器: 样例 1: 样例 2: 提示: 原题传送门: 分析 题解 rust go c++ java typescript python 11. 盛最多水的容器: 给定一个长 ...
- 算法探索_盛最多水的容器
问题描述: 给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其 ...
- 漫画:腾讯面试题(盛最多水的容器)
来自:小浩算法 01 PART 盛最多水的容器 这道题目会了的朋友可能觉得很简单,但是我觉得这题实在很经典,所以还是得拿出来讲讲.还有一个进阶版本"接雨水",将在后面为大家讲解. ...
- leetcode最小面积_每日一道 LeetCode (51):盛最多水的容器
❝ 每天 3 分钟,走上算法的逆袭之路. ❞ 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub:https://github.com/meteor1993/LeetCode Gi ...
- [Leedcode][JAVA][第11题][盛最多水的容器][双指针][贪心]
[问题描述]11.盛最多水的容器 给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 ...
- [贪心|双指针] leetcode 11 盛最多水的容器
[贪心|双指针] leetcode 11 盛最多水的容器 1.题目 题目链接 给你 n 个非负整数 a1,a2,-,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 ...
- 20200120:(leetcode)盛最多水的容器 两种解法
盛最多水的容器 题目 基本思路 代码实现 题目 给定 n 个非负整数 a1,a2,-,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ...
最新文章
- Android中View绘制流程以及invalidate()等相关方法分析
- plsqlfor循环输出三角形_glium指南-03-移动我们的三角形
- linux搭建lnnp_linux主机安装lnmp详细步骤
- React开发(101):样式处理
- Developmental Cell | 人类视网膜发育过程中的重要分子机制
- 为什么html运行之后不滚动,为什么很多移动端的HTML UI,在滚动时都用transform属性而不是用传统的滚动条?...
- BGP——同步功能【Synchronization】【路由黑洞】
- 秋风秋雨愁煞人:寒宵独坐心如捣
- Mysql学习总结(15)——Mysql错误码大全
- 利用两数之和实现两个数交换(java版本)
- java集合for循环_详解Java中list,set,map的遍历与增强for循环
- android中jni数据加密,Android jni字符串如何加密
- 产品经理的第二本书_笔记
- Kaggle TMDB 票房预测挑战赛
- AI实战:文本自动摘要简述
- 嵌入式FCT项目案例分享(STM32)
- c# cad中插入另一个dwg的图块
- 光纤软件测试,20m光纤速度怎么测试 20m光纤速度测试方法【详解】
- 【Android每日一讲】2012.11.27 向左或向右 - RadioGroup组与onCheckedChanged事件
- JAVA怎么产生一个随机数
热门文章
- android 屏幕录制方案,ShareREC for Android全系统录屏原理解析
- 怎么删除多余的启动项
- 手绘线条一直画不直_视频教程 | 绘画小白福音,曲线画不准、直线画不直?来,我教你...
- c++入门之内联函数,auto关键字
- C语言:有一函数y= x(x<1) 2x-1 (1≤x<10) 3x-11 (x≥10)用 scanf 函数输入 x 的值,求 y 值。
- 大学JAVA课堂笔记
- 浅谈高速公路服务区分布式光伏并网发电-Susie 周
- Centos中安装docker并查看拉取镜像的位置
- Hibernate Envers
- 看懂《C程序设计(第五版)学习辅导》第16章中介绍的用Visual Studio 2010对C程序进行编辑、编译、连接和运行的方法,并进行以下操作