首页/新闻资讯/正文详情

双指针算法实战:移动零与盛水容器问题解析

发布时间:2026/11/4 3:36:29 来源:云帆数科 栏目:资讯中心
双指针算法实战:移动零与盛水容器问题解析
1. 移动零问题解析与实现1.1 问题描述与要求给定一个数组 nums我们需要将所有 0 移动到数组的末尾同时保持非零元素的相对顺序。这个问题的难点在于必须在不复制数组的情况下原地对数组进行操作。举个例子输入[0,1,0,3,12]输出[1,3,12,0,0]注意原地操作意味着我们不能创建新数组来存储结果必须直接在原数组上进行修改。1.2 解决方案思路我采用的是一种双指针的变体方法具体思路如下使用一个变量 totalZeroes 来记录已经处理的零的数量遍历数组当遇到零时使用 splice 方法移除当前零在数组末尾添加一个零增加 totalZeroes 计数如果不是零则正常移动指针这种方法确保了时间复杂度O(n)因为每个元素最多被处理一次空间复杂度O(1)没有使用额外的存储空间1.3 代码实现详解const moveZeroes (nums) { let totalZeroes 0; for (let i 0; i nums.length - totalZeroes;) { if (nums[i] 0) { nums.splice(i, 1); nums.push(0); totalZeroes; } else { i } } return nums; }1.4 性能分析与优化虽然这个解法已经满足题目要求但我们可以进一步优化splice 和 push 操作虽然方便但在大规模数据下性能不佳更优的方法是使用双指针一个指向当前处理位置一个指向下一个非零元素应该放置的位置优化后的版本function moveZeroesOptimized(nums) { let lastNonZeroFoundAt 0; for (let i 0; i nums.length; i) { if (nums[i] ! 0) { nums[lastNonZeroFoundAt] nums[i]; } } for (let i lastNonZeroFoundAt; i nums.length; i) { nums[i] 0; } return nums; }这种实现避免了频繁的数组操作性能更好。2. 盛最多水的容器问题2.1 问题理解与建模这个问题要求我们在给定的高度数组中找到两条线使它们与x轴构成的容器能容纳最多的水。容器的容量由两个因素决定两条线之间的距离宽度两条线中较短的那条线的高度高度数学表达式为面积 min(height[left], height[right]) * (right - left)2.2 双指针解法最优解法是使用双指针法从数组的两端向中间移动const maxArea (height) { let max 0, left 0, right height.length - 1; while (left right) { max Math.max(max, (right - left) * Math.min(height[left], height[right])); if (height[left] height[right]) { left; } else { right--; } } return max; };2.3 算法正确性证明为什么这种方法能找到最大面积初始时宽度最大可能找到较大的面积移动较短的那一端因为容器的容量受限于较短的那一端通过不断移动指针我们确保了不会错过任何可能的更大面积2.4 复杂度分析时间复杂度O(n)只需遍历一次数组空间复杂度O(1)只使用了常数个额外空间3. 三数之和问题3.1 问题描述与难点给定一个整数数组nums找出所有不重复的三元组使得三元组的和为0。主要难点在于避免重复的三元组高效地找到所有可能的三元组3.2 排序加双指针解法const threeSum (nums) { nums.sort((a, b) a - b); const result []; for (let i 0; i nums.length - 2; i) { if (i 0 nums[i] nums[i - 1]) { continue; } let k nums.length - 1; for (let j i 1; j nums.length - 1; j) { if (j i 1 nums[j] nums[j - 1]) { continue; } while(j k nums[i] nums[j] nums[k] 0) { k--; } if (j k) { break; } if (nums[i] nums[j] nums[k] 0) { result.push([nums[i], nums[j], nums[k]]); } } } return result; }3.3 关键步骤解析首先对数组进行排序这是为了方便跳过重复元素使双指针法成为可能外层循环固定第一个数内层循环使用双指针寻找另外两个数跳过重复元素以避免重复的三元组3.4 复杂度分析时间复杂度O(n²)排序O(nlogn)双层循环O(n²)空间复杂度O(1)或O(n)取决于排序的实现4. 接雨水问题4.1 问题描述给定n个非负整数表示柱子的高度计算这些柱子能接多少雨水。这是一个经典的动态规划/双指针问题。4.2 双指针解法const trap (height) { let result 0, left 0, right height.length - 1, maxLeft 0, maxRight 0; while(left right) { if (height[left] height[right]) { if (height[left] maxLeft) { maxLeft height[left]; } else { result maxLeft - height[left]; } left } else { if (height[right] maxRight) { maxRight height[right]; } else { result maxRight - height[right]; } right--; } } return result; }4.3 算法思路使用双指针从两端向中间移动维护左右两边的最大值maxLeft和maxRight对于当前位置能接的雨水量取决于左右两边最大值中的较小值移动较小值那一端的指针因为较大值那一端决定了当前的水位4.4 复杂度分析时间复杂度O(n)只需遍历一次数组空间复杂度O(1)只使用了常数个额外空间5. 算法实战经验分享5.1 调试技巧在实际解决这些问题时我发现以下调试技巧很有帮助对于双指针问题在循环中打印指针位置和关键变量值对于边界情况手动计算预期结果并与程序输出对比使用小规模测试用例验证算法正确性5.2 常见错误在移动零问题中容易忽略原地操作的要求在盛水容器问题中可能会错误地同时移动两个指针在三数之和问题中容易忽略跳过重复元素的步骤在接雨水问题中可能会错误计算当前柱子的储水量5.3 性能优化建议尽量减少不必要的数组操作如splice合理利用排序预处理数据在双指针问题中仔细考虑指针移动的条件对于重复计算的值可以使用变量缓存6. 算法学习建议6.1 系统学习方法按类别刷题如双指针、动态规划等每解决一个问题总结其核心思想和变种定期复习已解决的问题尝试不同的解法参加编程竞赛或刷题小组与他人交流6.2 资源推荐LeetCode官方题解和讨论区《算法导论》等经典教材优质算法博客和视频教程在线判题系统的训练计划6.3 面试准备策略重点掌握常见算法类型和数据结构练习在白板或纯文本环境中编写代码训练清晰地表达解题思路的能力准备一些常见的follow-up问题通过系统地解决这些问题我深刻理解了双指针技巧的强大之处。在实际编程中选择合适的数据结构和算法往往能大幅提升代码效率。建议初学者从简单问题入手逐步提高难度同时注重理解算法背后的思想而非死记硬背代码。

相关推荐

Photoshop亮度蒙版原理与Lumenzia v12.0.2实战指南
Photoshop亮度蒙版原理与Lumenzia v12.0.2实战指南

1. 亮度蒙版不是“高级滤镜”,而是Photoshop里最硬核的选区逻辑你打开一张逆光人像,天空过曝、人脸欠曝,想单独提亮脸部又不破坏天空细节——这时候,很多人会下意识点开“曲线”或“色阶”,拉两下,结果要么… · 2026/11/4 3:36:29

OmniPact Dapp空投交互全流程与智能合约解析
OmniPact Dapp空投交互全流程与智能合约解析

1. OmniPact Dapp空投交互全流程解析最近区块链圈子里最火的项目非OmniPact莫属了。作为一个深耕区块链行业多年的开发者,我仔细研究了这个项目的技术架构和空投机制,发现确实有不少值得关注的创新点。下面我就从技术角度,带大家完整走一遍这… · 2026/11/4 3:36:29

生产级智能体平台设计:任务编排、工具管理与运行监控实践
生产级智能体平台设计:任务编排、工具管理与运行监控实践

1. 生产级智能体平台的全局设计:三个绕不开的核心模块大模型智能体已经不算新鲜事了,但“能跑通的demo”和“能扛住生产流量的平台”之间,隔着一条极宽的鸿沟。我见过太多团队把智能体嵌进业务流程,结果任务在深夜里悄然悬挂、工具… · 2026/11/4 3:36:29

pytest框架setup与teardown机制及fixture应用详解
pytest框架setup与teardown机制及fixture应用详解

1. pytest框架的四种级别setup与teardown机制解析在自动化测试领域,环境初始化和清理是保证测试用例独立性的关键。pytest作为Python生态中最主流的测试框架,提供了四种不同粒度的setup/teardown机制:1.1 模块级(module&#xff0… · 2026/11/4 4:17:39

AI时代三类软件巨头的生存切面:基础设施、垂直场景与通用平台
AI时代三类软件巨头的生存切面:基础设施、垂直场景与通用平台

1. 这不是预言,是正在发生的行业切片观察“软件帝国的黄昏”——这八个字刚在内部技术复盘会上被提出来时,会议室里有三秒的沉默。没人笑,因为没人觉得这是修辞。我坐在长桌尽头,看着投影上并列的三组数据:微软Azure A… · 2026/11/4 4:17:39

Vorssaint:macOS菜单栏原生效率锚点与微决策流优化工具
Vorssaint:macOS菜单栏原生效率锚点与微决策流优化工具

1. Vorssaint 不是“又一个菜单栏工具”,而是 macOS 效率流的物理锚点你有没有过这样的时刻:刚切到 Safari 查个资料,顺手点开备忘录记两行,接着切到终端跑个本地服务,再跳回 Slack 回复同事——不到三分钟&#xff0c… · 2026/11/4 4:17:39

XGBoost早停机制在医疗分类任务中的优化实践
XGBoost早停机制在医疗分类任务中的优化实践

1. 项目背景与核心价值医疗分类任务在临床决策支持系统中扮演着关键角色。当我们需要根据患者检查指标预测疾病风险时,传统机器学习方法常面临两个痛点:一是医疗数据往往存在样本量有限但特征维度高的问题;二是模型训练时容易在验证集上出现性… · 2026/11/4 4:17:39

ThinkPad T14 Gen2与T14P商务本对比与选购指南
ThinkPad T14 Gen2与T14P商务本对比与选购指南

1. 商务本双雄对决:ThinkPad T14 Gen 2与T14P系列定位解析每次帮企业客户选配移动办公设备时,ThinkPad T系列总是高频出现在采购清单上。但面对T14 Gen 2和T14P这两个命名相似的系列,不少IT采购专员都会陷入选择困难。作为长期跟踪商务本市场… · 2026/11/4 4:17:39

WinForm核心技术解析与企业级应用实践
WinForm核心技术解析与企业级应用实践

1. WinForm的现状与生命力解析WinForm作为.NET框架下的老牌桌面应用开发技术,在WPF、MAUI等新技术的冲击下依然保持着惊人的生命力。根据2023年Stack Overflow开发者调查,仍有超过28%的.NET开发者在使用WinForm进行开发,特别是在企业级应用领… · 2026/11/4 4:16:38

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

AI辅助技术栈评估:提升研发决策效率60%
AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17

从生成Token到直接决策:Jev如何重塑AI Agent工程实践
从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17

32G统一内存跑大模型:内存账、TPS实测与端云分流
32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码