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

双指针的用法

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.xdnf.cn/news/14703.html

相关文章:

  • Vue 3 Teleport 特性
  • 人工智能之数学基础:如何判断正定矩阵和负定矩阵?
  • 矩阵的逆 线性代数
  • LRU缓存设计与实现详解
  • Spring Cloud:服务监控与追踪的高级实践
  • C# 合并两个byte数组的几种方法
  • 零基础学习RabbitMQ(5)--工作模式(1)
  • C/C++数据结构之动态数组
  • ali PaddleNLP docker
  • vue-31(Nuxt.js 中的数据获取:asyncData和fetch)
  • XIP (eXecute In Place)
  • Spring AI Alibaba Nacos 集成实践
  • 【C++ 基础】 C++ 与 C 语言差异面试题(附大厂真题解析)
  • 【智能协同云图库】智能协同云图库第三弹:基于腾讯云 COS 对象存储—开发图片模块
  • 【Linux高级全栈开发】2.3.1 协程设计原理与汇编实现2.3.2 协程调度器实现与性能测试
  • 原型设计Axure RP网盘资源下载与安装教程共享
  • 【记录】服务器多用户共享Conda环境——Ubuntu24.04
  • 进阶向:Django入门,从零开始构建一个Web应用
  • Word之电子章制作——1
  • kubectl exec 原理
  • 力扣第73题-矩阵置零
  • Flutter基础(Children|​​Actions|Container|decoration|child)
  • git使用详解和示例
  • 【区块链】区块链交易(Transaction)之nonce
  • 【Docker基础】Docker容器管理:docker stats及其参数详解
  • C++共享型智能指针std::shared_ptr使用介绍
  • 机器学习配置环境
  • 某音Web端消息体ProtoBuf结构解析
  • 力扣 刷题(第七十一天)
  • 第七章——一元函数微分学的物理应用