【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();
    }
}

总结

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

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

相关推荐
江畔柳前堤1 天前
大语言模型分布式训练:从并行策略到万卡工程的系统梳理
人工智能·分布式·深度学习·算法·目标检测·机器学习·语言模型
Forever Nore1 天前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
罗西的思考1 天前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX1 天前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
爱跳舞的烤冷面1 天前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号1 天前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
月光船幽幽1 天前
影子模式下保护 logits 不被修改
人工智能·python·算法
马拉AI1 天前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
地平线开发者1 天前
征程6工具链模型X86推理方式说明
算法
地平线开发者1 天前
【征程6】校准量化中HistogramObserver解析
算法