08.盛最多水的容器

08.盛最多水的容器_第1张图片

✅ 解法一:暴力枚举(Brute Force)

✅ 思路:

  • 枚举任意两根柱子,计算它们能组成的容器的面积;
  • 取所有组合中的最大值。

⚠️ 缺点:

  • 时间复杂度 O(n²),容易超时,适用于学习/测试用。

✅ 代码:

class Solution {
public:
    int maxArea(vector<int>& height) {
        int area = 0;

        // 枚举所有可能的两根柱子
        for (int i = 0; i < height.size(); ++i) {
            for (int j = i + 1; j < height.size(); ++j) {
                int h = min(height[i], height[j]); // 取两者中较小的高度
                int w = j - i;                      // 宽度是下标之差
                area = max(area, h * w);            // 更新最大面积
            }
        }

        return area;
    }
};

✅ 解法二:双指针法(Two Pointers)【最优】

✅ 思路:

  • 定义两个指针 leftright,分别在数组两端;
  • 每次计算当前两柱形成的面积;
  • 谁矮就往中间移动一步,希望找到更高的柱子从而提高面积;
  • 因为宽度在缩小,所以只有高度能抵消它。

✅ 优点:

  • 时间复杂度 O(n)
  • 空间复杂度 O(1)
  • 官方推荐做法,几乎是最优的。

✅ 代码:

class Solution {
public:
    int maxArea(vector<int>& height) {
        int left = 0, right = height.size() - 1;
        int area = 0;

        while (left < right) {
            int h = min(height[left], height[right]); // 当前高度是两根柱子中矮的一根
            int w = right - left;                     // 当前宽度是两个指针之间的距离
            area = max(area, h * w);                  // 更新最大面积

            // 谁矮谁往中间走,希望找到更高的柱子
            if (height[left] < height[right]) {
                ++left;
            } else {
                --right;
            }
        }

        return area;
    }
};

✅ 总结对比:

解法 时间复杂度 是否超时 适用场景
暴力枚举法 O(n^2) ❌ 有可能超时 理解基本逻辑、打基础
双指针法 O(n) ✅ 高效 推荐用于提交

你可能感兴趣的:(LeetCode,hot,java,开发语言,算法,数据结构,c++,c语言)