11. Container With Most Water
- 左右指针
题目
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.
思路
从两边向中间遍历
- 矩形面积由底边长和高度决定
- 高度由两条边中短的一边决定,因此保证高度足够的前提是较短边足够高。
- 底边最长的是头尾的距离,可以此为基点,逐步向中间靠拢,寻找最大面积。
复杂性分析:
- 时间复杂度:O(n).
- 空间复杂度:O(1).
题解
class Solution {
public:
int maxArea(vector<int>& height) {
int left = 0, right = height.size()-1;
int maxArea = 0,tempArea = 0;
bool longLeft = false;
while (left < right) {
longLeft = false;
if (height[left] > height[right]) longLeft = true;
tempArea = (right - left) * (longLeft ? height[right] : height[left]);
if (tempArea > maxArea) maxArea = tempArea;
if (longLeft) right--;
else left++;
}
return maxArea;
}
};