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

【算法日记 17】LeetCode 11. 盛最多水的容器:双指针与贪心思维的完美碰撞

📍 题目背景

今天我们来啃一块算法面试中的硬骨头,也是极其经典的双指针大题:[11. 盛最多水的容器]。 这道题的官方描述有很多“坐标轴”、“垂线”之类的数学术语,很多新手一看就晕了。但其实,我们完全可以把它当成一个“挑木板拼鱼缸”的游戏!

【大白话题目描述】给你一排高低不平的木板(数组height),让你从中挑出两块木板作为鱼缸的左右两面墙。 你的目标是:找出哪两块木板拼成的鱼缸,能装下最多的水!(注意:水能装多高,取决于两块木板中较矮的那一块,也就是著名的“木桶效应”。)

【示例】

输入:[1,8,6,2,5,4,8,3,7]输出:49解释:选高度为 8 和高度为 7 的两块木板,宽度为 7,高度取矮的 7,最大面积7 * 7 = 49

✨ 核心破题逻辑:左右指针的“贪心博弈”

为了让鱼缸装最多的水,我们需要让宽度尽量大,同时高度也尽量高。 如果是暴力解法,两两组合去算面积,时间复杂度是 $O(N^2)$,在数据量大的时候必然会超时。

这就需要祭出我们的降维打击绝招:对撞双指针(左右指针)

1. 初始状态:霸占最大宽度

我们让左指针left站在最左边,右指针right站在最右边。此时,鱼缸的宽度是最大的!算出一个初始面积,记录下来。

2. 灵魂拷问:接下来该挪哪块木板?

既然要往中间找,我们每一次只能移动一块木板。到底该挪高的那一块,还是矮的那一块? 我们来推演一下:

  • 如果挪动高的木板:宽度变小了。而水的高度永远受限于那块没动的“矮木板”。所以,不管新找的木板有多高,水位都不可能超过原来的矮木板。结论:挪高木板,面积一定会变小,纯属血亏!

  • 如果挪动矮的木板:宽度虽然变小了,但是我们有可能遇到一块超级高的木板!这样一来,水位大幅提升,增加的高度完全可能弥补宽度的损失,从而创下面积新高!结论:挪矮木板,才有一线生机搏一把大的!

破题口诀:算完面积,谁矮,就无情地抛弃谁,让它往中间走一步寻找更高的木板!

💻 C++ 满分 AC 代码

掌握了上面的贪心逻辑,代码写起来简直行云流水,极其优雅:

#include <iostream> #include <vector> #include <algorithm> using namespace std; class Solution { public: int maxArea(vector<int>& height) { // 🚀 绝招:左右指针 int left = 0; // 左边的木板 int right = height.size() - 1; // 右边的木板 int max_area = 0; // 记录历史最大水量 // 当两块木板还没有相遇的时候,不断往中间挤 while (left < right) { // 1. 算宽度 (下标相减) int width = right - left; // 2. 算高度 (木桶效应,取决于矮的那块) int current_height = min(height[left], height[right]); // 3. 算当前容量,并看看有没有破纪录 int current_area = width * current_height; max_area = max(max_area, current_area); // 4. 核心贪心抉择:抛弃矮木板,去寻找更高的! if (height[left] < height[right]) { left++; // 左边矮,左边往右走一步寻找生机 } else { right--; // 右边矮,右边往左走一步寻找生机 } } return max_area; } };

🔍 复杂度深度剖析

  • 时间复杂度:$O(N)$。双指针leftright分别从两头往中间走,每次循环必定会淘汰一块木板(移动一个指针)。当两个指针相遇时遍历结束,所以整个数组最多只会被扫描一次。这比 $O(N^2)$ 的暴力解法快了几个数量级!

  • 空间复杂度:$O(1)$。我们只借用了leftrightmax_area等几个整型变量来记录状态,完全没有开辟任何新的数组或哈希表空间,内存消耗做到了极致的精简。

💡 总结:这道题是“双指针”结合“贪心思想”的巅峰之作。它的精髓不在于代码有多复杂,而在于那个直击灵魂的数学逻辑——“在确定性(宽度缩小)中,去寻找唯一可能打破天花板的变量(抛弃短板)”。吃透这个逻辑,以后遇到类似求极值的问题,你都能一击必杀!

http://www.jsqmd.com/news/1144629/

相关文章:

  • 比特的旅行:自信息、熵、信道容量……一个单位如何丈量整个信息世界
  • Python打包终极指南:用Auto-Py-To-Exe快速创建可执行文件
  • ssh: Could not resolve hostname
  • HarmonyOS 小游戏《对战五子棋》开发第14篇 - 困难AI实现:Minimax算法原理详解
  • 【导弹】基于 6 种制导律PPNGDPGVDPGRDPGRDPG_TRDPG_SAFE的飞行器交会(Rendezvous)制导附MATLAB 代码
  • Obsidian:重新定义英雄联盟游戏资源管理的技术解决方案
  • 2026年实用降AI率平台:亲测AI率从90%降至4%的实用方案
  • wushowhide.diagcab 工具实战:3步屏蔽Windows 11自动更新AMD显卡驱动
  • Mega安汇:把外汇投教内容建设做扎实,更谨慎的使用者更容易感受到的维度
  • 珠三角全栈AI智能体私有化大模型定制开发综合实力对比
  • AI时代,服务的主角依然是人|笃实科技客户服务最佳实践
  • KuGouMusicApi双版本架构技术解析与VIP权限兼容性解决方案
  • YOLO实战第四篇:训练曲线全方位解读教程(看懂收敛、过拟合、精度好坏,告别盲目训练)
  • 【安全与故障排查】04-Redis未授权访问漏洞修复与防御体系建立
  • de4dot实战指南:.NET程序反混淆原理与逆向工程实践
  • STM32L442KC与ISOM8710构建高压隔离系统设计
  • 瑞德克斯平台:把合规意识做扎实,新手更容易感受到的标准
  • SonarQube 10.x JWT 签名漏洞排查:从 none 算法到 HS256 的 5 个修复要点
  • 23个测试全绿,一个Token没花——LLM应用的单元测试该怎么写?
  • COCO 2017 与 MPII 数据集实战:3步完成关键点标注格式转换与可视化
  • 15个实用的团队协作平台,敏捷开发
  • 我以为代码整洁对 AI Agent 影响很大,结果 660 次测试告诉我错了
  • 基于ADM工具实现Qwen 35B大模型一键本地部署实践指南
  • AI 辅助理解 Rust 泛型:让模型用具体类型举例,再抽象回泛型
  • 海岛微电网仿真:3 种典型场景(晴/阴/负荷变化)下的能量管理策略对比分析
  • THPX信号源:把技术架构做到位——逻辑梳理与提示整理
  • 短剧系统数据模型怎么搭?短剧源码与短剧平台搭建技术实战
  • 3 种注意力机制改进 YOLOv7:在红外目标检测任务中的对比与《红外与激光工程》投稿适配
  • MAX77654与MKV42F嵌入式电源管理方案设计与优化
  • Xilinx Zynq-7000 7个关键引脚详解:POR_OVERRIDE到PS_INIT_B的硬件设计指南