《算法面试“必杀技”:双指针法高效解决数组原地操作》

《算法面试“必杀技”:双指针法高效解决数组原地操作》

🔥@晨非辰Tong:个人主页 

👀专栏:《C语言》《数据结构与算法》

💪学习阶段:C语言、数据结构与算法初学者

⏳“人理解迭代,神理解递归。”


引言:告别盲目刷题。学完顺序表后,集中攻克「删除有序数组重复项」、「移除元素」、「合并有序数组」这三道题,你将能一举掌握解决一大类数组问题的双指针技巧。

目录

 1.  力扣_26. 删除有序数组中的重复项(双“指针”法)

 2.  力扣_27. 移除元素(双“指针”法)

3.  88. 合并两个有序数组 - 力扣(LeetCode)


 1.  26. 删除有序数组中的重复项- 力扣(LeetCode)(双“指针”法)

--本题采用的方法为经典的双“指针”法(不是真的两个指针,只是两个变量的指向作用充当“指针”),此方法在以后的学习中经常会使用到。

--在结合前面所学的时间复杂度、空间复杂度舍弃了另外一种普遍、容易想到办法——>创建临时数组,将符合的元素拷贝到临时数组中,再进行数组值间的拷贝。
int removeDuplicates(int* nums, int numsSize) { //定义两个“指针” int label1 = 1, label2 = 0; while(label1 < numsSize) { //匹配 if(nums[label2] == nums[label1]) { label1++; } //不匹配 else { //判断label之间的距离 // <= 1 if((label1 - label2) <= 1) { label1++; label2++; } //>1 else { label2++; nums[label2] = nums[label1]; label1++; } } } return label2 + 1; }
--本题的解题参照为示例2(相较于示例1,涉及到的情况更加复杂,易考虑全面)。使用两个标记点来遍历数组,第一个标记点指向当前不重复数字的最后一个位置,第二个标记点负责在前面寻找新的不重复数字。初始化两个标记点:label2从0开始,label1从1开始。让label1逐个检查数组中的每个数字,当label1发现与label2不同的数字时:如果两个标记点相邻,就一起向前移动如果两个标记点不相邻,先把label2向前移动一位,再把label1的数字复制过来重复这个过程直到label1遍历完整个数组最终返回label2+1作为新数组的长度

 2.  27. 移除元素- 力扣(LeetCode)(双“指针”法)

--方法:双“指针”法

--本道题的解法仍旧使用双“指针”法。

--在结合前面所学的时间复杂度、空间复杂度舍弃了另外一种普遍、容易想到办法——>创建临时数组,将符合的元素拷贝到临时数组中,再进行数组值间的拷贝。
int removeElement(int* nums, int numsSize, int val) { int src = 0, dst = 0; while(src < numsSize) { src是val,src++ if(nums[src] == val) { src++; } src非val,赋值,整体++ else { nums[dst] = nums[src]; dst++; src++; } } return dst; }
//优化 int removeElement(int* nums, int numsSize, int val) { int src = 0, dst = 0; while(src < numsSize) { if(nums[src] != val) { nums[dst] = nums[src]; dst++; } src++; } return dst; }

示例一:要求k=2,两个非val值

--开头 src、dst 都在数组第一个元素,恰好 src = val(3),那么 src++(dst 不动,指向val值)。src = 2(非val),那么 nums[dst] = nums[src](2覆盖3),整体++。src = 2(非 val,dst指向空),src再++(dst不动)……最后src超过numsSize(循环终止条件),dst 指向nums[2]——>dst=2(要求返回的k值)。

3.  88. 合并两个有序数组 - 力扣(LeetCode)

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) { int l1 = m - 1; int l2 = n - 1; int l3 = m + n -1; while(l1 >= 0 && l2 >= 0) { //比较l1、l2谁数值大 if(nums1[l1] > nums2[l2]) { nums1[l3--] = nums1[l1--]; } else { nums1[l3--] = nums2[l2--]; } } //l1访问越界(l2没有越界,进行特殊的处理) while(l2 >= 0) { nums1[l3--] = nums2[l2--]; } //l2越界(不处理) //l1、l2同时越界(不存在) }

回顾:

《面试高频数据结构:单链表与顺序表之争,读懂“不连续”之美背后的算法思想》

【数据结构与算法】实战:暴力解VS最优解——一道轮转数组题引发的复杂度「血案」
结语:至此,我们不仅解决了三道题,更学会了如何用「双指针」维护数组的有效区间——这一思维,将是你在算法世界中探索的宝贵财富。

Read more

【AIGC】大模型面试高频考点19:常见的17种RAG方案

【AIGC】大模型面试高频考点19:常见的17种RAG方案

RAG技术全景解析:从基础分块到自适应多模态检索 * 一、基础分块与语义优化 * 1. Simple RAG(简单切块) * 2. Semantic Chunking(语义切块) * 3. Context Enriched Retrieval(上下文增强检索) * 4. Contextual Chunk Headers(上下文标题) * 二、检索优化与重排序 * 1. Document Augmentation(文档增强) * 2. Query Transformation(查询转换) * 3. Reranker(重排序) * 4. RSE(Re-ranking with Semantic Expansion) * 三、智能路由与自反思机制 * 1. Feedback Loop(反馈闭环) * 2. Adaptive RAG(

By Ne0inhk

Dify(Agent + RAG)指南:从安装到实战的开源 LLM 应用开发平台

Dify 完全指南:从安装到实战的开源 LLM 应用开发平台 摘要:本文详细介绍开源 LLM 应用开发平台 Dify 的完整使用流程,包括本地部署、API 配置、工作流编排、知识库管理,以及跨境电商客服和 Text2SQL 两个实战案例。 目录 1. Dify 简介 2. 本地部署指南 3. API 配置与集成 4. 自定义工具开发 5. 工作流类型详解 6. 知识库管理 7. 实战案例:跨境电商客服 8. 实战案例:Text2SQL 数据库查询 9. 网页集成方案 10. 总结与建议 1. Dify 简介 1.1

By Ne0inhk

AI伴侣开源实战:基于ZEEKLOG生态的智能对话系统集成指南

快速体验 在开始今天关于 AI伴侣开源实战:基于ZEEKLOG生态的智能对话系统集成指南 的探讨之前,我想先分享一个最近让我觉得很有意思的全栈技术挑战。 我们常说 AI 是未来,但作为开发者,如何将大模型(LLM)真正落地为一个低延迟、可交互的实时系统,而不仅仅是调个 API? 这里有一个非常硬核的动手实验:基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。 从0到1构建生产级别应用,脱离Demo,点击打开 从0打造个人豆包实时通话AI动手实验 AI伴侣开源实战:基于ZEEKLOG生态的智能对话系统集成指南 背景痛点分析 在ZEEKLOG生态中集成开源AI伴侣时,开发者常遇到几个典型问题: 1. API兼容性问题:多数开源项目使用Flask/Django等框架,与ZEEKLOG的OAuth2.0鉴权体系存在适配差异,需要额外处理JWT令牌刷新逻辑。

By Ne0inhk
在线地图交互优化,查询组件选项值支持过滤条件,DataEase开源BI工具v2.10.19 LTS版本发布

在线地图交互优化,查询组件选项值支持过滤条件,DataEase开源BI工具v2.10.19 LTS版本发布

2026年1月22日,人人可用的开源BI工具DataEase正式发布v2.10.19 LTS版本。 这一版本的功能更新包括:图表方面,在线地图交互优化,水波图新增同时展示具体数值和所占百分比的功能;数据大屏方面,外部参数关联查询组件支持控制其选项值的取值范围,配置跳转动作时支持自动携带查询组件的当前过滤条件至目标页面。 新增功能 ■ feature(图表):在线地图在隐藏缩放按钮时自动禁用缩放及拖拽操作(#17703); ■ feature(图表):水波图新增同时展示具体数值和所占百分比的功能(#17726); ■ feature(数据大屏):外部参数关联查询组件支持控制其选项值的取值范围; ■ feature(数据大屏):配置跳转动作时,支持自动携带查询组件的当前过滤条件至目标页面(#17595)。 功能优化 ■ refactor(图表):堆叠柱状图和条形图的标签默认显示指标信息; ■ refactor(图表):优化水波图标签的文本显示样式,提升可读性; ■ refactor(仪表板、数据大屏):优化Tab组件标题栏的背景样式(#17672); ■ refa

By Ne0inhk