盛水最多的容器问题详解:双指针法与暴力法的对比与实现

文章目录

    • 问题描述
    • 方法探讨
      • 方法一:暴力法(Brute Force)
        • 思路
        • 代码实现
        • 复杂度分析
      • 方法二:双指针法(Two Pointers)
        • 思路
        • 正确性证明
        • 代码实现
        • 复杂度分析
    • 方法对比
    • 总结

摘要
盛水最多的容器(Container With Most Water)是LeetCode上一道经典的算法题,考察对数组和双指针技巧的应用。本文将详细分析问题的核心思路,探讨暴力法和双指针法两种实现方法,并对比它们的性能差异。通过代码实现和复杂度分析,帮助深入理解如何高效解决此类问题。


问题描述

11. 盛最多水的容器
在这里插入图片描述

方法探讨

方法一:暴力法(Brute Force)

思路

暴力法是最直接的思路:遍历所有可能的线对组合,计算每对线构成的容器容量,记录最大值。

代码实现
public class Solution {public int maxAreaBruteForce(int[] height) {int maxArea = 0;for (int i = 0; i < height.length; i++) {for (int j = i + 1; j < height.length; j++) {int currentHeight = Math.min(height[i], height[j]);int currentWidth = j - i;maxArea = Math.max(maxArea, currentHeight * currentWidth);}}return maxArea;}
}
复杂度分析
  • 时间复杂度:O(n²),需要两重循环遍历所有可能的线对。
  • 空间复杂度:O(1),仅使用常数级额外空间。

缺点
当数组长度较大时(如 n=10^5),暴力法会超时,无法处理大规模数据。


方法二:双指针法(Two Pointers)

思路

双指针法通过一次遍历高效解决问题,核心思想是缩减搜索空间

  1. 初始化指针:左指针 left 指向数组起始位置,右指针 right 指向数组末尾。
  2. 计算容量:当前容量由 min(height[left], height[right]) * (right - left) 决定。
  3. 移动指针:每次移动高度较小的指针(因为移动较高的指针不会增加容量)。
  4. 更新最大值:比较并记录最大容量。
正确性证明

假设当前左右指针高度分别为 h[left]h[right],且 h[left] < h[right]。此时若固定 left,无论 right 如何左移,新的容量一定小于当前容量(因为宽度减小,高度不超过 h[left])。因此,必须移动左指针才有可能找到更大的容量。

代码实现
public class Solution {public int maxArea(int[] height) {int left = 0, right = height.length - 1;int maxArea = 0;while (left < right) {int currentHeight = Math.min(height[left], height[right]);int currentWidth = right - left;maxArea = Math.max(maxArea, currentHeight * currentWidth);// 移动较低的一侧指针if (height[left] < height[right]) {left++;} else {right--;}}return maxArea;}
}
复杂度分析
  • 时间复杂度:O(n),只需一次遍历。
  • 空间复杂度:O(1)。

方法对比

方法时间复杂度空间复杂度适用场景
暴力法O(n²)O(1)小规模数据
双指针法O(n)O(1)大规模数据

总结

  1. 暴力法虽然简单直观,但效率低下,仅适用于学习阶段的小规模数据验证。
  2. 双指针法通过缩小搜索空间将复杂度降至线性级别,是解决此问题的标准方法。
  3. 关键思路:移动较低一侧的指针,确保不会错过更大容量的可能性。

拓展思考
双指针法还可以用于解决其他类似问题,如“接雨水”(Trapping Rain Water) 从暴力到动态规划再到双指针:使用 Java 探索接雨水问题的不同解法。理解其核心思想有助于举一反三,应对更多复杂场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/79051.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图论-BFS搜索图/树-最短路径问题的解决

续上篇~图论--DFS搜索图/树-CSDN博客 先看第一次学习的博客&#xff01;&#xff01;&#x1f447;&#x1f447;&#x1f447;&#x1f447; &#x1f449; 有一些问题是广搜 和 深搜都可以解决的&#xff0c;例如岛屿问题&#xff0c;这里我们记dfs的写法就好啦&#xff0c;…

C++进阶——C++11_智能指针

目录 1、问题引入 2、RAII和智能指针 3、C标准库的智能指针 3.1 auto_ptr (不好) 3.2 unique_ptr 3.3 shared_ptr (重点) 3.4 weak_ptr (重点) 4、shared_ptr的循环引用问题(重点) 5、shared_ptr的线程安全问题 6、C11智能指针和boost的关系 7、内存泄漏 7.1 什么是…

数据库的基本原则

数据库的核心原则 原子性与持久性&#xff1a;原子性&#xff08;Atomicity&#xff09;确保一个事务中的所有操作要么全部完成&#xff0c;要么完全不执行&#xff0c;不会出现部分完成的情况。持久性&#xff08;Durability&#xff09;则保证一旦事务提交成功&#xff0c;即…

Java设计模式实战:装饰模式在星巴克咖啡系统中的应用

一、装饰模式简介 装饰模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其结构。这种模式创建了一个装饰类&#xff0c;用来包装原有的类&#xff0c;并在保持类方法签名完整性的前…

使用MPI-IO并行读写HDF5文件

使用MPI-IO并行读写HDF5文件 HDF5支持通过MPI-IO进行并行读写&#xff0c;这对于大规模科学计算应用非常重要。下面我将提供C和Fortran的示例程序&#xff0c;展示如何使用MPI-IO并行读写HDF5文件。 准备工作 在使用MPI-IO的HDF5之前&#xff0c;需要确保: HDF5库编译时启用…

七、自动化概念篇

自动化测试概念 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常&#xff0c;在设计了测试用例并通过评审之后&#xff0c;由测试人员根据测试用例中描述的过程一步步执行测试&#xff0c;得到实际结果与期望结果的比较。在此过程中&#xff0c;为了节省人…

redis cluster 的通信机制

Redis Cluster 的通信机制是其分布式架构的核心&#xff0c;基于 Gossip 协议 和 Cluster Bus 实现节点间状态同步与数据协调。以下是其通信机制的核心要点&#xff1a; 二进制协议&#xff1a;数据以字节流形式编码&#xff08;如Protobuf、Thrift、MQTT、Gossip&#xff09;。…

CTF web入门之文件上传

知识点 产生文件上传漏洞的原因 原因: 对于上传文件的后缀名(扩展名)没有做较为严格的限制 对于上传文件的MIMETYPE(用于描述文件的类型的一种表述方法) 没有做检查 权限上没有对于上传的文件目录设置不可执行权限,(尤其是对于shebang类型的文件) 对于web server对于上传…

PhotoShop学习09

1.弯曲钢笔工具 PhotoShop提供了弯曲钢笔工具可以直观地创建路径&#xff0c;只需要对分段推拉就能够进行修改。弯曲港币工具位于工具面板中的钢笔工具里&#xff0c;它的快捷键为P。 在使用前&#xff0c;可以把填充和描边选为空颜色&#xff0c;并打开路径选项&#xff0c;勾…

tsconfig.json配置不生效

说明一下我遇到的问题&#xff0c;这是我的配置文件代码的 {"compilerOptions": {"module": "none","target": "ES5","outFile": "./dist/bundle.js"} } 和我想象不同的是&#xff0c;我编译成 js 没…

源代码加密之零日攻击

# SDC沙盒&#xff1a;有效防御零日攻击的多层防护体系 在当今复杂多变的网络安全环境中&#xff0c;零日攻击已成为企业面临的重大威胁之一。零日攻击利用尚未被公众发现或尚未被软件供应商修复的漏洞进行攻击&#xff0c;具有极高的隐蔽性和破坏性。SDC沙盒作为一种先进的数…

记录一次TDSQL网关夯住故障

环境信息&#xff1a; TDSQL-MySQL同城双中心集群&#xff0c;集中式实例&#xff0c;一主三副本&#xff0c;每个中心两个db副本&#xff0c;每个中心一个VIP&#xff0c;V每个IP通过硬件做负载均衡指向该中心两个proxy&#xff0c;操作系统为麒麟v10 arm。 故障描述&#xf…

代码随想录八股训练营完结总结

&#xff01; 40天的训练营&#xff0c;我总结了自己完整的八股文&#xff0c;后续在面试过程中可以补充 很感谢这次训练营&#xff0c;真的高频&#xff0c;在面试中能击中60%以上&#xff0c;剩下的就靠平时的积累了。 感谢训练营的小伙伴&#xff0c;很多次想偷懒&#x…

VS Code 的 .S 汇编文件里面的注释不显示绿色

1. 确认文件语言模式 打开 .S 文件后&#xff0c;查看 VS Code 右下角的状态栏&#xff0c;确认当前文件的识别模式&#xff08;如 Assembly、Plain Text 等&#xff09;。如果显示为 Plain Text 或其他非汇编模式&#xff1a; 点击状态栏中的语言模式&#xff08;如 Plain Te…

iphone各个机型尺寸

以下是苹果&#xff08;Apple&#xff09;历代 iPhone 机型 的屏幕尺寸、分辨率及其他关键参数汇总&#xff08;截至 2023年10月&#xff0c;数据基于官方发布信息&#xff09;&#xff1a; 一、标准屏 iPhone&#xff08;非Pro系列&#xff09; 机型屏幕尺寸&#xff08;英寸…

VSCode写java时常用的快捷键

首先得先安好java插件 1、获取返回值 这里是和idea一样的快捷键的&#xff0c;都是xxxx.var 比如现在我new一个对象 就输入 new MbDo().var // 点击回车即可变成下面的// MbDo mbDo new MbDo()//以此类推get方法也可获取 mbDo.getMc().var // 点击回车即可变成下面的 // St…

相机内外参

文章目录 相机内参相机外参 相机的内外参是相机标定过程中确定的重要参数&#xff0c;用于建立图像像素坐标与实际世界坐标之间的关系。 相机内参 定义&#xff1a;相机内参是描述相机内部光学和几何特性的参数&#xff0c;主要包括焦距、主点坐标、像素尺度因子以及畸变系数等…

【视频目标分割论文集】Efficient Track Anything0000

github 摘要 视频对象分割和追踪任意目标领域出现了强大的工具——分割任意模型 2&#xff08;SAM 2&#xff09;。SAM 2 实现令人印象深刻的视频对象分割性能的关键组成部分包括用于帧特征提取的大型多阶段图像编码器&#xff0c;以及存储过去帧记忆上下文以辅助当前帧分割的…

CSS学习02 动态列数表格开发,解决多组数据布局与边框重合问题

概要 在前端开发中&#xff0c;表格常用于展示结构化数据。当数据组的字段数量不统一时&#xff08;如有的行包含 3 组数据&#xff0c;有的行包含 2 组或 1 组&#xff09;&#xff0c;传统固定列数的表格会出现结构错位、边框重合等问题。本文通过 HTML/CSS 规范方法&#x…

Spark-core编程总结

1.reduce‌ 功能‌&#xff1a;聚集RDD中的所有元素&#xff0c;先聚合分区内数据&#xff0c;再聚合分区间数据。 示例‌&#xff1a;rdd.reduce(__) 将RDD中的所有整数相加。 2.collect‌ 功能‌&#xff1a;在驱动程序中&#xff0c;以数组Array的形式返回数据集的所有元…