11. **Container With Most Water
https://leetcode.com/problems/container-with-most-water/description/
题目描述
Given n non-negative integers a1, a2, ..., an
, where each represents a point at coordinate (i, ai)
. n
vertical lines are drawn such that the two endpoints of line i
is at (i, ai)
and (i, 0)
. Find two lines, which together with x-axis forms a container, such that the container contains the most water.
Note: You may not slant the container and n
is at least 2.
使容器盛上最多的水. 给定 n
个非负的整数 , 每一个表示位于 处的点. 以 和 为端点可以作 n 条垂直的直线. 其中, 每两条直线和 x 轴可以组成一个容器, 现在要找到两条直线, 它们和 x 轴形成的容器容量最大.
解题思路
这道题应该采用双指针对撞的技术来减少考虑的情况. 但问题的关键是以什么标准来让两个指针进行移动. 通过仔细观察 height
可以发现, 当 i = 0, j = n - 1
时, 假设最大值 res
就是当前的容量, 那么之后 i
和 j
要怎样移动呢? 可以发现, 不管 i
和 j
如何移动, 容器的宽度始终是减小的, 而此时只有增大容器的高度, 才有可能使得容器的水增加. 那么此时就应该比较 height[i]
和 height[j]
的大小, 哪个小就移动哪个, 因为只有这样做才有可能获得更高的 “短板”.
C++ 实现 1
i
和 j
指向容器的两端, 用 res
保存最大容积. 比较容器两端的大小 height[i]
和 height[j]
, 哪个是短板就移动哪个. 时间复杂度为 , 空间复杂度为 .