【LeetCode Hot100】双指针:分离指针

前言

本章学习目的:掌握两个指针分别遍历不同序列解法。这个解法通常用于两个序列之间做匹配,合并,插入,交换。

88:合并两个有序数组

题目要求:

给你两个有序数组,要求把两个数组合并到其中一个数组,并且还是有序

核心思路

我们定义三个指针:

i → nums1 有效部分末尾(m-1)

j → nums2 末尾(n-1)

k → nums1 最后位置(m+n-1)

因为nums1的末尾都是0,所以我们从末尾添加数字

代码实现

java 复制代码
int i=m-1;
int j=n-1;
int k=m+n-1;

while(i>=0&&j>=0){
if(num1[i]>nums2[j]){
nums1[k]=nums1[i];
i--
}else{
nums1[k]=nums2[j];
j--;
}
k--;
while(j>=0){
nums1[k]=nums2[j];
j--;
k--;
}

总结

双指针分别从后向前遍历两个数组。

28:找出字符串中第一个匹配项的下标

题目要求:在 haystack 里找 needle 第一次出现的位置,字符串匹配问题

核心思路

定义两个指针:

i → 指向 haystack(主串)

j → 指向 needle(子串)

流程:

  1. i 从 0 开始遍历主串
  2. j 从 0 开始匹配子串
  3. 如果字符相等 → i++, j++
  4. 如果不等 → 回退 i,j 归0

代码实现

java 复制代码
class Solution {
    public int strStr(String haystack, String needle) {

        if (needle.length() == 0) return 0;

        int i = 0; // 主串指针
        int j = 0; // 子串指针

        while (i < haystack.length()) {

            if (haystack.charAt(i) == needle.charAt(j)) {
                i++;
                j++;
                
                // 完全匹配
                if (j == needle.length()) {
                    return i - j;
                }

            } else {
                // 回退:关键🔥
                i = i - j + 1;
                j = 0;
            }
        }

        return -1;
    }
}

总结

用双指针分别遍历两个字符串,通过比较字符是否相等来完成解答

1768:交替合并字符串

题目要求:

给你两个字符串

word1 = "abc"

word2 = "pqr"

要求:交替合并 → apbqcr

核心思想

两个指针各走各的,轮流取字符

代码实现

java 复制代码
int i=0;
int j=0;
StringBuilder res=new StringBuilder();
while(i<word1.length.length()||i<word2.length()){
if(i<word1.length()){
res.append(word1.charAt(i));
i++;
}else{
if(j<word2.length()){
res.append(word2.charAt(j));
j++;
}
}
return res.toString();

总结

掌握字符串于数组之间转换的语法

StringBuilder可变字符串类型

添加append(charAt)

392:判断子序列

题目要求:

给定字符串 s 和 t ,判断 s 是否为 t 的子序列。

代码实现

java 复制代码
class Solution {
    public boolean isSubsequence(String s, String t) {
        int i=0;
        int j=0;
        if(s.length()>t.length())return false;
        //前置条件      
        while(i<s.length()&&j<t.length()){
          if(t.charAt(j)==s.charAt(i)){
            i++;
          }
            j++;
        }
       return i==s.length();
    }
}

总结

本章学习的是双指针:分离指针

一般都是定义多个指针,每一个指针遍历多个数组,进行判断或者拼接。

相关推荐
吃好睡好便好5 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
仰泳之鹅5 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
x_yeyue7 小时前
三角形数
笔记·算法·数论·组合数学
念何架构之路9 小时前
Go语言加密算法
数据结构·算法·哈希算法
AI科技星9 小时前
《数学公理体系·第三部·数术几何》(2026 年版)
c语言·开发语言·线性代数·算法·矩阵·量子计算·agi
失去的青春---夕阳下的奔跑9 小时前
560. 和为 K 的子数组
数据结构·算法·leetcode
黎阳之光9 小时前
黎阳之光:以视频孪生重构智慧医院信息化,打造高标项目核心竞争力
大数据·人工智能·物联网·算法·数字孪生
丷丩10 小时前
三级缓存下MVT地图瓦片服务性能优化策略
算法·缓存·性能优化·gis·geoai-up
m0_6294947310 小时前
LeetCode 热题 100-----25.回文链表
数据结构·算法·leetcode·链表
ʚ希希ɞ ྀ11 小时前
单词拆分----dp
算法