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

优选算法-004 盛最多水的容器

题目链接:

盛最多水的容器

示例1:

优选算法-004

方法1:暴力破解

这个是最简单的方法,但是会超时

把所有的情况都算一遍,不断更新最大面积,循环结束,保留的结果就是最大面积

代码说明

  1. 核心逻辑:通过双重循环枚举所有可能的左右指针组合(i为左板,j为右板,且j > i);
  2. 容积计算:根据公式容积 = 宽度 × 短板高度,其中宽度是j - i,高度是Math.min(height[i], height[j])
  3. 最大值更新:每次计算后,若当前容积大于已记录的最大值,则更新最大值。

复杂度分析

  • 时间复杂度O(n²)(双重循环遍历数组,n为数组长度),当n较大时会超时(例如 LeetCode 测试用例中n可达 10⁵,此时暴力解法会超出时间限制);
  • 空间复杂度O(1)(仅使用常量级额外空间)。
public class Solution { public int maxArea(int[] height) { int maxVol = 0; int n = height.length; // 枚举所有可能的左指针i for (int i = 0; i < n; i++) { // 枚举所有可能的右指针j(j > i,避免重复计算) for (int j = i + 1; j < n; j++) { // 计算当前容器的宽度 int width = j - i; // 计算当前容器的高度(取两板中的短板) int h = Math.min(height[i], height[j]); // 计算当前容积 int vol = width * h; // 更新最大容积 if (vol > maxVol) { maxVol = vol; } } } return maxVol; } }

方法2:

双指针方法

针对 “盛最多水的容器” 问题,双指针法是效率最高的解法,核心思路是通过左右指针向中间收缩,每次移动较短的那一侧指针,从而逼近最大容积

解法说明

  1. 指针初始化:左指针left从数组开头出发,右指针right从数组末尾出发;
  2. 容积计算:每次计算当前指针构成的容器容积(公式:宽度 × 短板高度);
  3. 指针移动逻辑
    • 若左板更短:移动左指针(尝试找到更长的左板,提升高度);
    • 若右板更短:移动右指针(尝试找到更长的右板,提升高度);
  4. 终止条件:左右指针相遇时,遍历结束,此时maxVol即为最大容积。

示例验证(输入[1,8,6,2,5,4,8,3,7]

  • 初始指针:left=0(高度 1)、right=8(高度 7),容积8×1=8
  • 移动左指针→left=1(高度 8),此时容积7×7=49(更新最大容积为 49);
  • 后续指针收缩过程中,容积均未超过 49,最终返回49(与示例输出一致)。

复杂度分析

  • 时间复杂度O(n)(仅遍历数组一次);
  • 空间复杂度O(1)(仅使用常量级额外空间)。
public class Solution { public int maxArea(int[] height) { int left = 0; // 左指针:初始指向数组左端 int right = height.length - 1; // 右指针:初始指向数组右端 int maxVol = 0; // 记录最大容积 while (left < right) { // 计算当前容器的宽度 int width = right - left; // 计算当前容器的高度(取左右指针中较短的板) int h = Math.min(height[left], height[right]); // 计算当前容积 int currentVol = width * h; // 更新最大容积 maxVol = Math.max(maxVol, currentVol); // 移动较短的那一侧指针(关键:缩短宽度的同时,尝试增加高度) if (height[left] < height[right]) { left++; } else { right--; } } return maxVol; } }
http://www.cnnetsun.cn/news/1539.html

相关文章:

  • 一个构建指定坐标轴在默认点(0,0)的构造方法《python语言程序设计》2018版--第8章17题第2部分
  • 知识点总结
  • 初级电气工程师考试题2
  • 【强化学习】第二章:老虎机问题、ε-greedy算法、指数移动平均
  • Oracle数据库内存管理实操指南:PGA与SGA优化实战
  • 1分钟搭建 Redis三主三从集群!附完整自动化脚本(直接复制可用)
  • 在线教程丨30毫秒处理100个检测对象,SAM 3实现可提示概念分割,性能提升2倍
  • 基于web的酒品商城购物系统的设计与实现-计算机毕业设计源码31522
  • 软件代码去个性化是智能制造落地的有效途径
  • 如何了解腾讯云国际站代理商FL有什么跨境优势呢?
  • 开发日志-正点原子RK3568运行Qt项目
  • 萨拉赫如何用一次采访,毁掉自己在利物浦的八年传奇?
  • 18场造14球仍遭弃!巴萨为何对拉什福德关上大门?
  • 如何设计安全的 Web API 访问
  • 算法竞赛备考冲刺必刷题(C++) | AcWing 1169 糖果
  • 算法竞赛备考冲刺必刷题(C++) | 洛谷 P5960 差分约束
  • 工业智能体的五级跃迁:从对话到执行的智能化革命
  • C语言实现isalpha函数功能(附带源码)
  • C语言实现多种方法求解定积分(附带源码)
  • C语言实现骑士旅游算法(附带源码)
  • C语言实现toupper函数功能(附带源码)
  • C语言实现isdigit函数功能(附带源码)
  • C语言实现维吉尼亚密码加解密算法(附带源码)
  • C语言实现仿射变换加解密算法(附带源码)
  • C语言实现文件分割(附带源码)
  • C语言实现辗转相除法(附带源码)
  • C语言实现学生管理系统(附带源码)
  • 多站点跨境电商平台数据 API 接口接入与说明
  • 网络国际出口怎么选?企业如何避免踩坑?
  • 电信宽带怎么申请公网ip?企业组网避坑指南