【LeetCode Hot100】盛最多水的容器[特殊字符]双指针法,Java实现!图文详解,小白也能秒懂!

💻 [LeetCode Hot100] 盛最多水的容器🔥双指针法,Java实现!图文详解,小白也能秒懂!

✏️本文对应题目链接:盛最多水的容器


📌 题目描述

给定一个长度为 n 的整数数组 height,其中 height[i] 表示第 i 条垂直线的高度。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

示例:

输入:height = [1, 8, 6, 2, 5, 4, 8, 3, 7]
输出:49
解释:选择第2条线(高度8)和第9条线(高度7),容器宽度为7,容量为 min(8, 7) * 7 = 49

🧠 解题思路(图文分解)

❗ 核心难点

如何在O(n)时间复杂度内找到最大容量的容器?

双指针法(黄金思路)✨

关键步骤:

  1. 初始化指针left 指针指向数组开头,right 指针指向数组末尾
  2. 计算容量:容量 = 最小高度 × 宽度(right - left
  3. 移动指针:每次移动高度较小的指针(因为移动高度较大的指针不会增加容量)
  4. 更新最大值:记录遍历过程中的最大容量

动态过程图解:

初始状态:[1, 8, 6, 2, 5, 4, 8, 3, 7]
- left=0, right=8 → 容量=min(1,7)*8=8
- 移动left(高度较小)→ left=1
- left=1, right=8 → 容量=min(8,7)*7=49
- 移动right(高度较小)→ right=7
- left=1, right=7 → 容量=min(8,3)*6=18
- 移动right(高度较小)→ right=6
- left=1, right=6 → 容量=min(8,8)*5=40
- 移动left或right均可 → 结束

🚀 代码实现

class Solution {
    public int maxArea(int[] height) {
        int left = 0; // 左指针
        int right = height.length - 1; // 右指针
        int maxArea = 0; // 记录最大容量

        // 双指针遍历
        while (left < right) {
            // 计算当前容量
            int currentArea = Math.min(height[left], height[right]) * (right - left);
            // 更新最大容量
            maxArea = Math.max(maxArea, currentArea);

            // 移动高度较小的指针
            if (height[left] < height[right]) {
                left++;
            } else {
                right--;
            }
        }

        return maxArea;
    }
}

💡 复杂度分析

  • 时间复杂度:O(n) → 只需遍历数组一次
  • 空间复杂度:O(1) → 仅使用常数空间

🌟 总结要点

双指针核心作用:高效缩小搜索范围
贪心思想:每次移动高度较小的指针,确保不漏解
适用场景:区间问题、最大最小值问题


🔥 下期预告:《三数之和》双指针法的经典应用!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值