LeetCode 11题“盛最多水的容器”
题目
https://leetcode.cn/problems/container-with-most-water/description/?envType=study-plan-v2&envId=selected-coding-interview
问题分析
LeetCode 11题“盛最多水的容器”要求在给定的一组垂直线中,找出两条线,使得它们与x轴共同构成的容器可以容纳最多的水。容器的容量由两条线之间的距离和较短线的高度决定。
解题思路
最直接的方法是枚举所有可能的线对并计算其容量,但这种方法的时间复杂度为O(n²),效率较低。更优的解法是使用双指针法:
- 初始化双指针:一个指向数组的开始(left),另一个指向数组的末尾(right)。
- 计算当前容量:使用当前左右指针所指的线计算容量,并更新最大容量。
- 移动指针:每次移动较短的那条线的指针(向内移动)。这是因为移动较长的线不会增加容量,而移动较短的线可能找到更高的线,从而增加容量。
- 重复步骤2-3:直到左右指针相遇。
这种方法的时间复杂度为O(n),因为只需要遍历一次数组。
代码实现
下面是使用C++实现的代码:
#include <vector>
using namespace std;class Solution {
public:int maxArea(vector<int>& height) {int left = 0;int right = height.size() - 1;int max_area = 0;while (left < right) {// 计算当前容量int current_area = min(height[left], height[right]) * (right - left);max_area = max(max_area, current_area);// 移动较短的线的指针if (height[left] < height[right]) {left++;} else {right--;}}return max_area;}
};
代码解释
- 初始化变量:
left
和right
分别指向数组的首尾,max_area
用于记录最大容量。 - 循环条件:只要
left
小于right
,就继续循环。 - 计算当前容量:容量由较短的线和两线之间的距离决定。
- 更新最大容量:如果当前容量大于已记录的最大容量,则更新。
- 移动指针:移动较短的线的指针,以寻找可能更大的容量。
这种方法通过贪心策略,逐步缩小搜索空间,确保在O(n)时间内找到最优解。