力扣校招算法通关:双指针技巧全场景拆解 —— 从数组操作到环检测的高效解题范式

力扣校招算法通关:双指针技巧全场景拆解 —— 从数组操作到环检测的高效解题范式

文章目录

前言

在力扣校招算法题中,双指针技巧是一类高频且实用的解题方法。它并非真正的 “指针”,而是通过两个数组下标(或迭代器)的协同移动,在数组划分、区间求解、环检测等场景中实现高效遍历与逻辑处理,往往能将时间复杂度从暴力法的 O(n平方)优化至O(n),是校招笔试和面试中突破数组类难题的关键武器。

本专栏将围绕力扣校招高频的双指针题型展开,从 “移动零”“复写零” 的数组操作,到 “快乐数” 的环检测、“盛最多水的容器” 的区间优化,再到 “三数之和” 的多指针协同,逐一拆解双指针的核心逻辑、边界处理与去重技巧,帮助你建立 “看题辨双指针,提笔知如何移” 的解题思维,从容应对校招算法考察中的数组类挑战。

双指针

常用于:数组划分和数组分块

注意:这里的指针不是真的指针,是数组的下标

例题讲解

移动零 力扣

283. 移动零

cur:从左往右遍历数组

dest:已处理区间内,非零元素的最后一个位置
在这里插入图片描述
代码展示:classSolution{public:voidmoveZeroes(vector<int>& nums){int dest =-1;int cur =0;for(;cur<nums.size();cur++){if(nums[cur]!=0){swap(nums[dest+1],nums[cur]); dest++;}else{;}}}};

复写零 力扣

1089. 复写零

注意:这题要求不要在超过该数组长度的位置写入元素

步骤:

一:先找到最后一个被复写的数

找法:1.先判断cur位置的值(cur放到下标0位置,dest放到下标-1位置)

5.如果dest超过最后那个数的位置

二:从后向前完成复写操作
引申:vector的size()-1就是最后一个位置的下标 区分元素和下标 区分==和= 注意:size()在用来表示下标的时候,建议赋值给int类型的之后再用 不然 eg:dest<a.size()-1的时候,dest会整形提升,如果是-1就惨了 
代码展示:classSolution{public:voidduplicateZeros(vector<int>& arr){int cur =0;int dest =-1;for(;dest<(int)arr.size()-1;cur++){if(arr[cur]==0) dest++; dest++;} cur--;if(dest == arr.size()){ arr[arr.size()-1]=0; dest-=2; cur--;}for(;cur>=0;cur--){ arr[dest]= arr[cur];if(arr[cur]==0) arr[--dest]=0; dest--;}}};

快乐数 力扣

202. 快乐数

这么说的话,那就只有可能为1或者无限循环(和无限不循环区分)--所以想到环 环的话用快慢双指针去解决 注意:快慢指针的起点都是n 快慢指针一定会在环入口相遇 
引申:一定要动手模拟一下示例
代码展示:classSolution{public:intalgorithm(int p){int sum =0;int q =0;while(p>=10){ q = p%10; p/=10; sum+=q*q;} sum+=p*p;return sum;}boolisHappy(int n){int slow = n;int fast = n; slow =algorithm(n); fast =algorithm(slow);while(slow!=fast){ slow =algorithm(slow); fast =algorithm(fast); fast =algorithm(fast);}if(slow ==1)returntrue;elsereturnfalse;}};

盛最多水的容器 力扣

11. 盛最多水的容器

做法:left放在最左边,right放在最右边

比较完之后,看left和right哪个对应的值小些,就把哪个向另外一边靠近
代码展示:classSolution{public:intmaxArea(vector<int>& height){int cur =0;int dest = height.size()-1;int max1 =0;while(cur!=dest){ max1 =max(max1,(dest-cur)*min(height[dest],height[cur]));if(height[cur]<height[dest]) cur++;else dest--;}return max1;}};

有效三角形的个数 力扣

611. 有效三角形的个数

相关数学知识: 三角形最小的那两边之和>最大那一边就可以构成三角形了
方法:先给数组排序,然后先固定最大的数,在最大的数的左边用双指针算法去找符合的数;然后再缩小最大的数…

注意:如果nums[left]+nums[right]>nums[c],那right-left就是第二大数下标为rgiht时的总个数,然后right--)

注意区分c和nums[c]!!!
代码展示: classSolution{public:inttriangleNumber(vector<int>& nums){sort(nums.begin(),nums.end());int c = nums.size()-1;int ret =0;while(c>=2){int left =0;int right = c-1;while(left!=right){if((nums[left]+nums[right])>nums[c])//记得加括号{ ret+=right-left; right--;}else left++;} c--;}return ret;}};

查找总价格为目标值的两个商品 力扣

查找总价格为目标值的两个商品

这个题有单调性,用双指针正好(或者二分算法)–能用双指针肯定优先用双指针

注意:此题没说找不到怎么办,就不用管那种情况,但是!力扣要求所有路径都要有返回值,在最后加个return …就行了,但是要是能转化为vector<int>类型的,比如nullptr就不行
引申:eg: return {1,1};可以被隐式转成vector<int>类型的(函数返回值是vector<int>的情况下) 
代码展示:classSolution{public: vector<int>twoSum(vector<int>& price,int target){ vector<int>ret;int left =0;int right = price.size()-1;while(left!=right){if(price[left]+price[right]>target) right--;elseif(price[left]+price[right]<target) left++;else{ ret.push_back(price[left]); ret.push_back(price[right]);break;}}return ret;}};

三数之和 力扣

三数之和

这种和怎么样怎么样的一般都排序之后用双指针

这个题跟上面的有效三角形的个数有点像
细节问题:

1.去重

left和right以及固定的那个数都要跳过重复元素(哪个跟哪个比较==才去要注意)–于此同时要避免越界,比如:left一直要<right

补充:当然也可以找出所有结果之后,用unordered_set去重——可是,去面试的时候这两种方法都可能会问到

2.不漏

找到一种结果之后,不能直接break出去,要eg:left++;right--继续寻找
引申:迭代器和下标怎么确立关系:(下标为p)–迭代器连续的那种才行(eg:vector算,list不算)

eg:auto a = ret.begin()+p

eg:int a = 1,double b = 0;是不行的
引申:题目给的target不要直接拿来运算,不然后续想要原来的就难了 eg:vector<vector<int>>的取名叫vv很好 溢出问题很容易读题时考虑到,后面又忘了--比如应该写long long int 又写成了int 
代码展示:classSolution{public: vector<vector<int>>threeSum(vector<int>& nums){ vector<vector<int>> ret;sort(nums.begin(),nums.end());int i =0,j =0;for(int k = nums.size()-1;k>=2;k--){if(nums[k]<0)break; i =0;j = k-1;while(i<j){if(nums[i]+nums[j]+nums[k]>0) j--;elseif(nums[i]+nums[j]+nums[k]<0) i++;else{ ret.push_back({nums[i],nums[j],nums[k]}); i++;j--;//去重while(nums[i]== nums[i-1]&&i<j) i++;while(nums[j]== nums[j+1]&&i<j) j--;}}while(nums[k]== nums[k-1]&&k>=2) k--;}return ret;}};

Read more

【Linux系统编程】(三十五)揭秘 Linux 信号产生:从终端到内核全解析

【Linux系统编程】(三十五)揭秘 Linux 信号产生:从终端到内核全解析

前言         在 Linux 系统中,信号是进程间异步通信的 “信使”,而 “信号产生” 则是这个通信过程的起点。无论是我们熟悉的Ctrl+C终止进程,还是程序运行中出现的段错误、定时器超时,本质上都是信号被触发产生的过程。很多开发者只知道 “信号能终止进程”,却不清楚信号到底是怎么来的 —— 是用户操作触发的?还是系统自动产生的?不同场景下信号的产生机制有何不同?         本文将基于 Linux 内核原理,结合 5 种核心信号产生场景(终端按键、系统命令、函数调用、软件条件、硬件异常),用通俗的语言,带你全方位揭秘信号产生的底层逻辑,让你不仅 “知其然”,更 “知其所以然”。下面就让我们正式开始吧! 一、信号产生的核心本质:谁在 “发送” 信号?         在深入具体场景之前,我们先明确一个核心问题:信号是由谁产生并发送的?答案是操作系统(OS)。         无论信号的触发源头是用户按键、函数调用还是硬件异常,

By Ne0inhk
Flutter 三方库 dloader 的鸿蒙化适配指南 - 掌握极简且高性能的文件离线技术、助力鸿蒙应用构建稳健的后台下载与资源调度系统

Flutter 三方库 dloader 的鸿蒙化适配指南 - 掌握极简且高性能的文件离线技术、助力鸿蒙应用构建稳健的后台下载与资源调度系统

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 dloader 的鸿蒙化适配指南 - 掌握极简且高性能的文件离线技术、助力鸿蒙应用构建稳健的后台下载与资源调度系统 前言 在 OpenHarmony 鸿蒙应用向大容量、多资源协同(如:大型游戏素材更新、离线地图包下载、企业级加密文档分发)进化的过程中,单纯的 HttpClient 请求已无法满足用户对“进度可见性”、“后台持续性”以及“异常自愈”的渴望。dloader 作为一个专为 Dart 设计的流式下载组件,旨在通过一套极为精简的 DSL(领域特定语言),将复杂的多线程分片、百分比计算及缓存校验逻辑封装在黑盒之中。本文将探讨如何在鸿蒙端利用 dloader 打造“丝滑且可信”的资源获取体验。 一、原原理分析 / 概念介绍 1.1 基础原理

By Ne0inhk
Flutter for OpenHarmony: Flutter 三方库 dart_appwrite 将鸿蒙应用极速接入强大的开源后端即服务(BaaS 最佳实践)

Flutter for OpenHarmony: Flutter 三方库 dart_appwrite 将鸿蒙应用极速接入强大的开源后端即服务(BaaS 最佳实践)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在进行 OpenHarmony 应用开发时,后端基础设施往往是中小型开发者或初创团队的拦路虎。购买服务器、部署数据库、集成 OAuth 登录、管理文件云存储……这一系列工作不仅耗时,还容易在安全性上出现漏洞。 dart_appwrite 是连接 OpenHarmony 应用与 Appwrite(类似于 Firebase 的开源替代品)的官方桥梁。它为鸿蒙开发者提供了全套的后端 API,让你在短短几分钟内就能为鸿蒙应用增加账号系统、实时数据库和云存储功能,彻底实现“一人完成全栈开发”。 一、鸿蒙-Appwrite 云端架构图 该库作为桥梁,将鸿蒙设备的请求安全分发到后端各个功能模块。 鸿蒙 App (Dart SDK) Appwrite Client Account (身份验证) Databases (文档型数据库) Storage

By Ne0inhk
使用LLaMA-Factory的数据集制作流程与训练微调Qwen3及评估

使用LLaMA-Factory的数据集制作流程与训练微调Qwen3及评估

文章目录 * 1 LLaMA-Factory环境安装 * 2 数据集制作 * 3 模型下载 * 4 使用命令进行训练 而非webui * 训练命令 * 导出模型命令 * 5 训练后的Qwen3模型评估 * 6 训练后的Qwen3模型进行测试 AutoDL中的LLaMA-Factory 使用 训练微调 llame3数据集 cmmlu 使用LLaMA-Factory微调训练Qwen2-VL-7B/Qwen2.5-VL-7B与视觉大模型数据集制作流程与训练评估 b站:https://www.bilibili.com/video/BV1KceNzoE87/ 本文介绍了使用LLaMA-Factory框架微调Qwen3-4B-Instruct-2507模型的完整流程。内容包括:1) 环境安装与WebUI配置;2) 数据集制作与格式要求;3) 通过ModelScope下载Qwen3模型;4) 使用命令行进行LoRA微调训练,展示了训练参数与GPU使用情况;5) 模型导出方法;6) 最后对微调后的模型进行评估。整个过程在6块GPU上约15分钟完成训练,并提供了训练

By Ne0inhk