当前位置: 首页 > 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;
}
http://www.lqws.cn/news/574309.html

相关文章:

  • 指针篇(6)- sizeof和strlen,数组和指针笔试题
  • 请求转发,响应重定向
  • 在Linux系统中部署Java项目
  • 边界的艺术:支持向量机与统计学习时代的王者
  • 学习日志02 ETF 基础数据可视化分析与简易管理系统
  • 从身体营养元素方向考虑,缺乏哪些元素会导致我偏头痛?
  • GAN的思考及应用
  • 04_JSP进阶_EL_JSTL
  • 养老保险交得越久越好
  • Python爬虫:Requests与Beautiful Soup库详解
  • 机器学习9——决策树
  • 矩阵及矩阵快速幂
  • 【算法设计与分析】(四)Strassen 矩阵
  • 免费SSL证书一键申请与自动续期
  • 贝叶斯自学笔记——基础工具篇(一)
  • 数据库-事务
  • 大数据Hadoop之——Flume安装与使用(详细)
  • sqlserver函数与过程(二)
  • 【Docker基础】Docker容器管理:docker inspect及其参数详解
  • 使用component封装组件和h函数的用法
  • Win10/Win11电源和电池设置打不开/卡住的解决方案(查看 电池健康度报告)
  • 【无标题】linux系统中无法删除文件后空间没有被释放还在被占用
  • AI智能体|扣子(Coze)搭建【沉浸式历史故事解说视频】工作流
  • 设计模式 | 过滤器模式
  • Springboot 集成 SpringBatch 批处理组件
  • 战略进阶——解读124页战略分析工具【附全文阅读】
  • #华为昇腾#华为计算#昇腾开发者计划2025#
  • Elasticsearch 集群升级实战指引—7.x 升级到 8.x
  • 开发者视角:一键拉起与快速安装的巧妙运用
  • 精通C++包括哪些方面