news 2026/8/29 18:08:40

每日算法精讲 Day 3(双指针基础) | 移动零 复写零 与 LeetCode 202. 快乐数 与 LeetCode 11.盛最多水的容器 与 LeetCode 611 有效三角形的个数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
每日算法精讲 Day 3(双指针基础) | 移动零 复写零 与 LeetCode 202. 快乐数 与 LeetCode 11.盛最多水的容器 与 LeetCode 611 有效三角形的个数

目录

引言:

283. 移动零

题目分析

逻辑梳理(快排分区思想)

代码实现

复杂度分析

1089. 复写零

题目分析

逻辑梳理

代码实现

复杂度分析

202. 快乐数

题目分析

逻辑梳理(快慢指针判环)

代码实现

复杂度分析

11. 盛最多水的容器

题目分析

逻辑梳理(对向双指针)

代码实现

复杂度分析

611. 有效三角形的个数

题目分析

逻辑梳理(排序 + 双向指针)

代码实现

复杂度分析

结语:


引言:

双指针是算法面试中最常用、最高效的技巧之一。它通过维护两个指针的相对位置,将暴力 O(n²) 的解法优化到 O(n),且通常只需 O(1) 的额外空间。本文精选 5 道 LeetCode 经典题目,从数组操作到数学规律,带你掌握双指针的核心思想。

接下来进入正文————>


283. 移动零

题目分析

将数组中的所有 0 移动到末尾,同时保持非零元素的相对顺序不变。


逻辑梳理(快排分区思想)

维护两个指针lr

  • l左侧:全部为非零元素
  • lr之间:全部为0
  • r右侧:待处理区域

r遍历完数组时,所有 0 自然被"挤"到了右侧。


代码实现

class Solution { public: void moveZeroes(vector<int>& nums) { int l = -1,r = 0; while(r<nums.size()) { if(nums[r]) swap(nums[++l],nums[r++]); else r++; } } };

复杂度分析

  • 时间复杂度:O(N)
  • 空间复杂度:O(1)

1089. 复写零

题目分析

遍历数组,遇到 0 就复写一次,后续元素整体右移一位。要求原地修改


逻辑梳理

如果从前往后复写,0 会占两个位置,导致后续未处理的元素被覆盖。因此采用从后往前的策略:

  1. 第一步:先找到"最后一个被复写的数"的位置
  2. 第二步:从后向前进行复写操作

代码实现

AC码

class Solution { public: void duplicateZeros(vector<int>& arr) { int cur = 0, dest = -1; while (dest < (int)arr.size()) { if (arr[cur]) dest++; else dest += 2; if (dest >= arr.size() - 1) break; cur++; } if (dest == arr.size()) { arr[dest - 1] = arr[cur]; dest -= 2; cur--; } while (cur>=0) { if (arr[cur] == 0) arr[dest--] = arr[cur]; arr[dest--] = arr[cur--]; } } };

复杂度分析

  • 时间复杂度:O(N)
  • 空间复杂度:O(1)

202. 快乐数

题目分析

判断一个数字是否"快乐": repeatedly 替换为各位数字的平方和,最终能否得到 1。


逻辑梳理(快慢指针判环)

将每次运算后的结果视为链表中的节点:

  • 如果最终能得到 1,会进入1 → 1 → 1...的循环
  • 如果不能得到 1,会进入其他循环

使用快慢指针:慢指针每次走一步,快指针每次走两步。若相遇时值为 1,则是快乐数;否则不是。


代码实现

AC码

class Solution { public: int func1(int k) { int ans = 0; while(k) { ans += pow(k%10,2); k/=10; } return ans; } bool isHappy(int n) { int slow = n; int fast = func1(n); while(slow!=fast) { slow = func1(slow); fast = func1(func1(fast)); } if(fast==1) return true; else return false; } };

复杂度分析

  • 时间复杂度:O(N)
  • 空间复杂度:O(1)

11. 盛最多水的容器

题目分析

给定 n 条垂线,找出两条线使得与 x 轴构成的容器能盛最多的水。面积 = 两线距离 × 较短线的高度。


逻辑梳理(对向双指针)

  • left从最左端开始,right从最右端开始(此时宽度最大)
  • 每次移动高度较小的指针向中间靠拢
  • 原理:宽度在减小,只有可能通过增加高度来获得更大面积

代码实现

class Solution { public: int maxArea(vector<int>& height) { int left = 0,right = height.size()-1; int ans = min(height[left],height[right])*(right-left); while(left!=right) { if(height[left]<height[right]) left++; else right--; ans = max(ans,min(height[left],height[right])*(right-left)); } return ans; } };

复杂度分析

  • 时间复杂度:O(N)
  • 空间复杂度:O(1)

611. 有效三角形的个数

题目分析

给定数组,统计能组成三角形的三元组个数(下标不同即可)。


逻辑梳理(排序 + 双向指针)

三角形判定:两边之和大于第三边。先排序,然后固定最长边nums[i],用双指针找另外两边:

  • left = 0,right = i - 1
  • nums[left] + nums[right] > nums[i],则[left, right-1]所有元素与right组合都满足,累加right - left,然后right--
  • 否则left++

代码实现

class Solution { public: int triangleNumber(vector<int>& nums) { sort(nums.begin(),nums.end()); int ans = 0; for(int i = 2;i<nums.size();i++) { int left = 0,right = i-1; while(left<right) { if(nums[left]+nums[right]<=nums[i]) left++; else { ans += right-left; right--; } } } return ans; } };

复杂度分析

  • 时间复杂度:O(N²)
  • 空间复杂度:O(1)

结语:

双指针的精髓在于利用有序性或单调性,将枚举转化为移动。无论是同向指针维护窗口、对向指针收缩范围,还是快慢指针检测循环,核心都是减少不必要的重复计算。掌握这些经典模型,面试中的数组问题将迎刃而解。

希望以上内容对你有所帮助,感谢观看,若觉得写的还可以,可以分享给朋友一起来看哦,毕竟一起进步更有动力嘛,当然能关注一下就更好啦。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/29 18:02:57

AI短剧到AI观众:内容生产流水线的工程化拆解

最近在内容行业里有一个判断被反复讨论&#xff1a;AI短剧、漫剧、恋综、电影、艺人都有了&#xff0c;AI观众也不远了。第一次看到这个说法时&#xff0c;我心里是打问号的&#xff0c;尤其是“AI观众”四个字&#xff0c;听起来更像营销文案。但把这一串项目放在一起看&#…

作者头像 李华
网站建设 2026/8/29 18:01:24

ChatGPT商务高级席位:团队升级、迁移与Codex CLI配置实践

最近开发者社区里&#xff0c;ChatGPT 桌面版的一个报错频繁刷屏&#xff1a;ChatGPT failed to start. Unable to locate the Codex CLI binary.不少用户以为是自己安装姿势不对&#xff0c;反复卸载重装&#xff0c;结果依然卡在同一个界面。这个现象本身比报错内容更有意思&…

作者头像 李华
网站建设 2026/8/29 18:00:41

《易学・恒䷟|道影子新解 032》

摘要恒卦&#xff08;䷟&#xff09;承接咸卦 “阴阳交感、感而遂通” 之后&#xff0c;揭示当感应确立、关系稳固&#xff0c;系统便进入 “恒久持守、久而不衰” 的恒常力场。其本质是雷风相与、刚柔相应&#xff0c;上震下巽&#xff0c;长子长女各守其位&#xff0c;以恒久…

作者头像 李华
网站建设 2026/8/29 17:59:51

工业AI落地难点解析:垂直场景高适配需求下,多模型聚合架构的制造业应用实践

工业制造领域是AI落地难度最高、专业性最强、容错率最低的垂直场景之一。制造业包含设备运维、故障诊断、工艺优化、生产管控、安全巡检、工艺文档管理、新人培训、工业知识库沉淀等复杂业务链路。传统工业数字化依赖传统MES、ERP、SCADA系统&#xff0c;仅能实现数据采集与监控…

作者头像 李华
网站建设 2026/8/29 17:58:37

大模型不止写代码:非编码工作流接入LLM实战指南

如果你是一名程序员&#xff0c;近期应该经常被问到一个问题&#xff1a;大模型到底能不能帮你做“不写代码”的工作&#xff1f; 在 Hacker News 上有人专门发帖提问&#xff1a;你们会在和编码无关的工作里使用 LLM 吗&#xff1f;评论区的答案很有意思&#xff0c;有人用来…

作者头像 李华
网站建设 2026/8/29 17:58:34

GUI半透明渲染中的ALPHA通道:直通与预乘模式解析

1. 为什么说ALPHA通道是GUI界面里最容易“埋雷”的一环 做GUI开发这么多年&#xff0c;我见过太多界面效果“看起来不对劲”的案例&#xff1a;一张带圆角的PNG图标拖到界面上&#xff0c;四周出现一圈脏兮兮的黑边&#xff1b;窗口设置了半透明效果&#xff0c;结果整个窗体像…

作者头像 李华