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

每日算法精讲 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)

结语:

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

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

http://www.cnnetsun.cn/news/4291485.html

相关文章:

  • AI短剧到AI观众:内容生产流水线的工程化拆解
  • ChatGPT商务高级席位:团队升级、迁移与Codex CLI配置实践
  • 《易学・恒䷟|道影子新解 032》
  • 工业AI落地难点解析:垂直场景高适配需求下,多模型聚合架构的制造业应用实践
  • 大模型不止写代码:非编码工作流接入LLM实战指南
  • GUI半透明渲染中的ALPHA通道:直通与预乘模式解析
  • 车载Qi V1.3无线充电器STSAFE-V110认证方案全解析
  • 把 GitHub 项目写进简历:HR 和技术面试官看的根本不是同一件事
  • TokenSpend:AI模型调用成本归因与ROI核算方案
  • 【12-kubenetes的持久化存储】
  • 知识蒸馏原理与PyTorch实战:避开过度蒸馏的陷阱
  • CVTE秋招面试全攻略:从技术原理到实战策略的深度复盘
  • 免费查ai率去哪里才可靠?AIGC检测、AI降重和论文查重入口区别
  • 迅雷AI工程师笔试复盘:核心考点与答题策略
  • 基于SpringBoot的救援物资管理系统(毕设源码+文档)
  • 本地开源大模型实战:社交文本情感识别与意图拆解全流程
  • 具身智能TVA-VLA缓解灾难性遗忘新方案
  • LLM的跳跃能力:从零样本学习到本地与云端模型自由切换
  • OpenAI与Hugging Face整合指南:API调用与本地模型部署实战
  • 基于SpringBoot的健身房会员管理系统(源码+讲解视频+LW)
  • C++ STL核心组件解析:从容器、迭代器到算法与实战指南
  • MATLAB神经网络实战:从BP网络原理到数学建模代码实现
  • Linux PipeWire深度解析之pw_thread_loop_wait调用流程与实战(八十七)
  • 【关注可白嫖源码】--课程设计--毕业设计--基于Spring Boot+ECharts的NBA数据智慧分析平台[编号:project31971](案件分析)
  • Socat 命令总结
  • 网易NLP算法工程师校招笔试全解析:考点、套路与避坑指南
  • Python控制流深度解析:条件判断、循环与流程控制实战指南
  • 仿微信H5聊天室源码解析:多人群聊IM系统搭建与部署
  • STM32H5 DA调试认证证书链命令行批量生成与产线自动化实践
  • 高并发动效页面的可用性