LeetCode 11题“盛最多水的容器”

题目

https://leetcode.cn/problems/container-with-most-water/description/?envType=study-plan-v2&envId=selected-coding-interview

问题分析

LeetCode 11题“盛最多水的容器”要求在给定的一组垂直线中,找出两条线,使得它们与x轴共同构成的容器可以容纳最多的水。容器的容量由两条线之间的距离和较短线的高度决定。

解题思路

最直接的方法是枚举所有可能的线对并计算其容量,但这种方法的时间复杂度为O(n²),效率较低。更优的解法是使用双指针法:

  1. 初始化双指针:一个指向数组的开始(left),另一个指向数组的末尾(right)。
  2. 计算当前容量:使用当前左右指针所指的线计算容量,并更新最大容量。
  3. 移动指针:每次移动较短的那条线的指针(向内移动)。这是因为移动较长的线不会增加容量,而移动较短的线可能找到更高的线,从而增加容量。
  4. 重复步骤2-3:直到左右指针相遇。

这种方法的时间复杂度为O(n),因为只需要遍历一次数组。

代码实现

下面是使用C++实现的代码:

#include 
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;
    }
};

代码解释

  1. 初始化变量leftright分别指向数组的首尾,max_area用于记录最大容量。
  2. 循环条件:只要left小于right,就继续循环。
  3. 计算当前容量:容量由较短的线和两线之间的距离决定。
  4. 更新最大容量:如果当前容量大于已记录的最大容量,则更新。
  5. 移动指针:移动较短的线的指针,以寻找可能更大的容量。

这种方法通过贪心策略,逐步缩小搜索空间,确保在O(n)时间内找到最优解。

你可能感兴趣的:(LeetCode 11题“盛最多水的容器”)