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.
11. **Container With Most Water_编程使容器盛上最多的水. 给定 ​​​n​​​ 个非负的整数 11. **Container With Most Water_两个指针_02, 每一个表示位于 11. **Container With Most Water_两个指针_03 处的点. 以 11. **Container With Most Water_算法与数据结构_0411. **Container With Most Water_两个指针_03 为端点可以作 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]​​​, 哪个是短板就移动哪个. 时间复杂度为 11. **Container With Most Water_时间复杂度_06, 空间复杂度为 11. **Container With Most Water_时间复杂度_07.

class Solution {
public:
int maxArea(vector<int>& height) {
int i = 0, j = height.size() - 1;
int res = 0;
while (i < j) {
int area = (j - i) * std::min(height[i], height[j]);
res = max(area, res);
height[i] < height[j] ? ++ i : -- j;
}
return res;
}
};