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

双指针的用法

0 双指针的场景

📌 双指针常见问题类型
1️⃣ 定长/变长区间
找满足条件的最长/最短/固定长度子数组或子串
核心是维护一个可变的滑动区间 [lp, rp]
2️⃣ 两端逼近型
在有序数组里找两数之和、三数之和
核心是两个指针从两头往中间靠拢

1 双指针的模板

int lp = 0;
for (int rp = 0; rp < n; rp++) {while (lp <= rp && 不合法(lp, rp)) {lp++;}// [lp, rp] 此时是合法区间// 进行操作
}

2 例题

✅ 例子 1:最长无重复子串
题目:
给定一个字符串 s,找出其中不含重复字符的最长子串长度。
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>int lengthOfLongestSubstring(char* s) {int max = strlen(s);int last[128] = {0};int countDuplicates = 0; // 记录重复字符数量int maxLen = 0;int lp = 0;for (int rp = 0; rp < max; rp++) {char c = s[rp];last[c]++;if (last[c] == 2) { // 说明新增一个重复字符countDuplicates++;}while (countDuplicates > 0) { // 有重复就收缩窗口char leftChar = s[lp];last[leftChar]--;if (last[leftChar] == 1) { // 减少一个重复字符countDuplicates--;}lp++;}if (rp - lp + 1 > maxLen) {maxLen = rp - lp + 1;}}return maxLen;
}int main() {printf("%d\n", lengthOfLongestSubstring("abcabcbb")); // 结果应该是 3 ("abc")printf("%d\n", lengthOfLongestSubstring("bbbbb"));    // 结果应该是 1 ("b")printf("%d\n", lengthOfLongestSubstring("pwwkew"));   // 结果应该是 3 ("wke")return 0;
}

相关文章:

  • Nginx漏洞处理指南
  • [database] Closure computation | e-r diagram | SQL
  • llama.cpp学习笔记:后端加载
  • VMware设置虚拟机为固定IP
  • Java--可变参数--作用域--构造器--this
  • Qwen-VL系列全面解析:从技术突破到应用实践
  • OSPF(开放最短路径优先)
  • ROS常用的路径规划算法介绍
  • Excel之将一堆姓名拆成一列4
  • 1.认识Docker
  • 第十二节:Vben Admin 最新 v5.0 (vben5) 快速入门 - 两种权限控制方式(附前后端代码)
  • 《伴时匣》app开发技术分享--表单提交页(5)
  • STM32H723ZGT6-修改内存分布以定义很大的数组
  • HarmonyOS 公共事件机制介绍以及多进程之间的通信实现(9000字详解)
  • FPGA实现CameraLink视频解码,基于Xilinx ISERDES2原语,提供4套工程源码和技术支持
  • 闲庭信步使用SV搭建图像测试平台:第十九课——YCbCr图像转RGB图像
  • 多模态大语言模型arxiv论文略读(143)
  • python基础23(2025.6.29)分布式爬虫(增量式爬虫去重)redis应用_(未完成!)
  • Vue列表渲染与数据监测原理
  • win上对调ctrl和alt键