当前位置: 首页 > news >正文

LeetCode 11.盛最多水的容器 (Java)

力扣11. 盛最多水的容器:双指针法详解

一句话点明白你

被官方题解的一位大佬的评论点醒,在这里分享给大家:**我们left++和right–都是为了尝试取到更多的水,如果短的板不动的话,取到的水永远不会比上次多。**你品,你细品!!

题目描述

给定一个长度为 n 的整数数组 height,表示垂直线的长度。找到两条垂线,使得它们与 x 轴共同构成的容器能容纳最多的水。返回容器的最大储水量。

示例

  • 输入:height = [1,8,6,2,5,4,8,3,7] → 输出:49
  • 输入:height = [1,1] → 输出:1

解法思路:双指针法

核心思想

容器储水量由 宽度较短板的高度 共同决定。双指针法从数组两端向中间移动,每次移动较短的边,通过缩小宽度来寻找更高的板,从而探索更大的储水量。

正确性证明

  • 贪心策略:移动较短的边可能使高度增加,而移动较长的边只会减少宽度且高度不会超过原短板。
  • 数学保证:每次移动后,虽然宽度减小,但保留更长的边有机会找到更高的短板,从而弥补宽度损失。

算法步骤

  1. 初始化指针:左指针 left = 0,右指针 right = height.length - 1
  2. 循环计算
    • 计算当前容器的储水量:面积 = min(height[left], height[right]) * (right - left)
    • 更新最大储水量。
    • 移动较短的边的指针(左指针右移或右指针左移)。
  3. 终止条件:当 left == right 时结束循环。

代码实现

public static int maxArea(int[] height) {int left = 0;                   // 左指针int right = height.length - 1;  // 右指针int res = 0;                    // 最大储水量while (left < right) {// 计算当前容器的储水量int currentRes = Math.min(height[left], height[right]) * (right - left);res = Math.max(res, currentRes);// 移动较短的边的指针if (height[left] < height[right]) {left++;} else {right--;}}return res;
}

力扣通过截图

在这里插入图片描述

复杂度分析

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

示例解析

以输入 height = [1,8,6,2,5,4,8,3,7] 为例:

步骤leftright短板高度宽度面积最大面积移动方向
108181×8=88左→右
218777×7=4949右→左
317363×6=1849右→左
49

最终最大储水量为 49,由左指针 1(高度 8)和右指针 8(高度 7)组成的容器获得。


边界情况处理

  • 全零数组:所有高度为 0,储水量始终为 0。
  • 所有高度相同:储水量由宽度决定,初始宽度最大。
  • 单峰/双峰分布:双指针法能正确找到最大容器。

总结

  • 双指针法的优势:通过一次遍历高效解决问题,避免暴力法的 O(n²) 复杂度。
  • 关键思想:移动较短的边以探索更高的板,确保不漏掉更大储水量的可能性。

相似问题

  • 42. 接雨水
  • 15. 三数之和

掌握双指针法的移动策略,能有效解决数组中的区间最优问题!

http://www.dtcms.com/a/179508.html

相关文章:

  • CBO和HBO区别及介绍
  • 【软件测试学习day7】Junit5
  • 抛物线法(二次插值法)
  • C++卡特兰数讲解
  • 避免数据丢失:在存储测试数据之前,要做好Redis持久化
  • 牙科CBCT性能检测模体的革新价值
  • springmvc的入门案例
  • 链表的面试题4之合并有序链表
  • JDBC:java与数据库连接,Maven,MyBatis
  • C++漫步结构与平衡的殿堂:AVL树
  • 基于卫星遥感数据进行农作物长势监测原理简述
  • Spring普通配置类 vs 自动配置类-笔记
  • 2.5 特征值与特征向量
  • 适配国产化,私有化部署的局域网即时通讯工具-BeeWorks
  • C语言if语句的用法(非常详细,通俗易懂)
  • 如果说开启的TIM3定时器有ccr1,ccr2,ccr3,我想要关闭ccr2的PWM输出,怎么通过代码实现
  • 软件测试学习笔记
  • 操作系统 : 线程概念与控制
  • 芯片笔记 - 手册参数注释
  • STM32G070xx将Flash页分块方式存储,固定数据块存储,实现一次擦除多次写入
  • 关系代数操作之复杂扩展操作
  • 【每天学习一点点】使用Python的pathlib模块分割文件路径
  • 力扣刷题Day 41:除自身以外数组的乘积(238)
  • n8n - 开放灵活的智能自动化工作流平台
  • vue教程(vuepress版)
  • 【Python】pyinstaller 反编译 exe
  • FPGA图像处理(四)------ 图像裁剪
  • 【C语言】(8)—指针2
  • 65.Three.js案例-使用 MeshNormalMaterial 和 MeshDepthMaterial 创建 3D 图形
  • Screeps Arena基础入门