【优选算法】不允许你还不会双指针

【优选算法】不允许你还不会双指针


🌟 各位看官好,我是egoist2023

🌍 种一棵树最好是十年前,其次是现在!


🚀 今天来学习双指针的相关用法

👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享给更多人哦

目录

 移动零

代码实现

复写零

代码实现

快乐数

代码实现

盛最多水的容器

代码实现

有效三角形个数

代码实现



 移动零

 

针对这种数组分块、数组划分的问题,可以考虑使用双指针(前后双指针)思想进行划分。

代码实现

 void moveZeroes(vector<int>& nums) { int left=-1,cur=0; while(cur<nums.size()) { if(nums[cur]!=0) swap(nums[++left],nums[cur]); cur++; } }

复写零

(错误)决策一:利用双指针从前向后遍历时往dest上填写会发现行不通,它会把之后的数覆盖。

因此我们只能考虑"从后向前"的策略完成复写。

决策二:"从后向前"复写

难点1:如何确定cur从哪里开始向前遍历?

难点2:是否含有边界情况?如何处理?

此类题是半模拟题,需要不断地画图总结。

定义cur指向下标为0的位置,dest指向-1,通过遍历cur并让其指向的值决定dest是走一步还是走两步,当dest>=n-1时即找到了cur的位置。

特殊情况:通过上述方法,处理情况2时会发现dest==n,因此需要把arr[n-1]=0,同时cur--,dest-=2。

代码实现

void duplicateZeros(vector<int>& arr) { //确定cur的位置 int cur=0,dest=-1,n=arr.size(); while(cur<n) { //根据cur的值决定dest走一步还是两步 if(arr[cur]==0) dest+=2; else dest++; if(dest>=n-1) break; cur++; } //处理边界情况 if(dest==n) { arr[n-1]=0; cur--; dest-=2; } //"从后向前"复写 while(cur>=0) { if(arr[cur]==0) { arr[dest--]=0; arr[dest--]=0; } else arr[dest--]=arr[cur]; cur--; } }

快乐数

通过模拟n=19和2的情况,可以发现只会出现两种情况。

情况1:最后的值为1时是围绕1无限循环下去

情况2:无限循环成环

解决此类题目一般采用快慢双指针的解法 --> 快慢指针相遇时判断其值是否为1即可。

1.定义快慢指针fast和slow

2.fast每次走两步,slow每次走一步。

3.由于这两种情况都会成环,因此slow和fast最终会在环中相遇,判断相遇值即可。 

代码实现

bool isHappy(int n) { //快慢指针 int slow=n,fast=square(n); while(fast!=slow) { slow=square(slow); fast=square(fast); fast=square(fast); } if(fast==1) return true; else return false; } int square(int n) { int sum=0; while(n) { int ret=n%10; sum+=ret*ret; n/=10; } return sum; }

盛最多水的容器

方案一:我们可以遍历数组,将每一个能容量的水量都计算出来,最后用sort即可得出最终答案,但这样肯定会超时,因此需采用其他方案来解决。

方案二:定义left指向下标0位置,right指向下标n-1位置,利用双指针解决。

代码实现

int maxArea(vector<int>& height) { int Max=INT_MIN; int left=0,right=height.size()-1; while(left<right) { int h=min(height[left],height[right]); Max=max(Max,h*(right-left)); if(height[left]<height[right]) left++; else right--; } return Max; }

有效三角形个数

解法:在数组有序的情况下,如果nums[left]+nums[right]<=sum ,根据单调性只有让left++才有可能使nums[left]+nums[right]>sum

代码实现

int triangleNumber(vector<int>& nums) { sort(nums.begin(),nums.end()); int n=nums.size(),tmp=n-1,size=0; while(tmp>1) { int left=0,right=tmp-1; while(left<right) { if(nums[left]+nums[right]>nums[tmp]) { size+=right-left; right--; } else left++; } tmp--; } return size; }

三数之和 

四数之和

根据题意可知需返回所有和为0且下标不重复的三元组。

解法1:先进行排序(方便去重),把每种情况都暴力枚举一遍, 然后利用库中的set去重,毋庸置疑,这个解法是会超时的。

解法2:当我们对数组排序后,这个数组就是一个单调的数组,那么利用双指针就可以解决此问题。

但是又如何把重复的三元组进行去重呢?

先left++,对left进行去重时,看看left指向元素是否与前面的一个元素相等,相等的话left继续++,直到不相等为止。同样需对right和i进行去重。

 

vector<vector<int>> threeSum(vector<int>& nums) { //1.排序 sort(nums.begin(),nums.end()); //2.双指针 vector<vector<int>> ret; int n=nums.size(); for(int i=0;i<n-2;) { for(int j=i+1,k=n-1,flag=-nums[i];j<k;) { if(nums[j]+nums[k]>flag) k--; else if(nums[j]+nums[k]<flag) j++; else { ret.push_back({nums[i],nums[j],nums[k]}); //去重 j++,k--; while(j<k&&nums[j-1]==nums[j]) j++; while(j<k&&nums[k+1]==nums[k]) k--; } } //去重 i++; while(i<n&&nums[i]==nums[i-1]) i++; } return ret; }

四数之和 <-- 此题是建立在三数之和完成后的类似题目 


Read more

【Copilot配置】—— Copilot 设置全解析 + 最佳实践|解锁 AI 辅助开发效率天花板

【Copilot配置】—— Copilot 设置全解析 + 最佳实践|解锁 AI 辅助开发效率天花板

Copilot 设置全解析 + 最佳实践|解锁 AI 辅助开发效率天花板 使用 GitHub Copilot 有一段时间的开发者,大概率会有一个共同感受:默认设置能满足基础需求,但想要让它真正贴合自己的开发习惯、兼顾效率与安全,就必须深入挖掘其设置面板的细节。很多人忽略了 Copilot 丰富的可配置项,导致未能充分发挥它的辅助价值,甚至遇到安全隐患或体验卡顿等问题。 今天这篇博客,将完全贴合实际开发场景,先系统梳理 Copilot 核心设置模块的功能说明,再给出经过实测的最佳实践,无论是新手还是资深开发者,都能跟着配置出最适合自己的 Copilot 环境(本文基于 Copilot 最新版本,包含实验性功能的合理使用建议)。 一、先理清:Copilot 设置面板的核心模块划分 Copilot 的设置面板看似繁杂,但本质可分为 5 大核心模块,所有配置都围绕“效率、安全、个性化”三个核心目标展开,先记住这个划分,后续配置时不会混乱:

By Ne0inhk

【AIGC行业前沿】2026年2月AIGC行业模型发布以及主要前沿资讯

目录 1. 阿里Qoder发布Qwen-Coder-Qoder 2. Kimi与南大发布SimpleSeg赋能模型像素感知 3. 字节研究团队发布ConceptMoE提升AI推理 4. 阶跃星辰发布并开源模型Step 3.5 Flash 5. 智谱发布并开源OCR模型GLM-OCR 6. xAI正式发布Grok Imagine 1.0视频模型 7. 优必选开源具身智能大模型Thinker 8. 通义千问发布开源编程模型Qwen3-Coder-Next 9. OpenAI宣布GPT-5.2系列模型提速40% 10. OpenBMB发布多模态模型MiniCPM-o 4.5 11. ACE Studio与StepFun联合发布开源音乐模型ACE-Step 1.5 12. Ai2发布轻量级开源编码模型SERA-14B 13. 上海AI实验室推出万亿参数多模态科学推理模型Intern-S1-Pro 14. Mistral AI开源40亿参数实时语音模型Voxtral Mini 4B Realtime 2602 15. 快手可灵发布可灵3.0 1

By Ne0inhk

AI编程工具深度对比:Cursor、Copilot、Trae与Claude Code,2025年开发者该如何选择?

2025年,AI编程助手已从新奇技术演变为生产力核心,但面对众多选择,开发者如何才能找到最适合自己的智能编程伙伴? 一、四大AI编程工具的核心定位与市场格局 2025年的AI编程工具市场已经形成了明显的分层格局。根据最新的开发者使用数据,这些工具不再仅仅是代码补全助手,而是朝着专业化、场景化方向发展。

By Ne0inhk

Copilot登录总失败?这7种情况你必须马上检查

第一章:Copilot登录失败的常见现象与影响 GitHub Copilot 作为广受欢迎的AI编程助手,在实际使用过程中,部分开发者频繁遭遇登录失败的问题。这一问题不仅影响编码效率,还可能导致开发流程中断,尤其在团队协作或紧急修复场景下尤为显著。 典型登录失败现象 * 输入凭据后提示“Authentication failed”但账号密码正确 * VS Code 中 Copilot 图标持续显示加载状态,无法完成初始化 * 浏览器重定向至 GitHub 授权页面时卡顿或返回空白页 * 终端输出错误日志:Copilot service is unreachable 对开发工作流的影响 影响维度具体表现编码效率失去代码补全与建议功能,手动编写耗时增加调试体验无法快速生成测试用例或错误解释团队协同新成员因无法启用 Copilot 导致上手速度下降 基础诊断命令 在 VS Code 终端中执行以下命令可获取当前认证状态: # 查看 Copilot 扩展日志 code --log debug # 检查已安装扩展及版本 code --list-extensions

By Ne0inhk