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

总结

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

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

相关推荐
学习永无止境@2 小时前
Verilog中有符号数计算
图像处理·算法·fpga开发
6Hzlia2 小时前
【Hot 100 刷题计划】 LeetCode 41. 缺失的第一个正数 | C++ 原地哈希题解
c++·leetcode·哈希算法
小肝一下2 小时前
每日两道力扣,day6
数据结构·c++·算法·leetcode·双指针·hot100
ambition202422 小时前
【算法详解】飞机降落问题:DFS剪枝解决调度问题
c语言·数据结构·c++·算法·深度优先·图搜索算法
徒 花2 小时前
Python知识学习08
java·python·算法
chushiyunen2 小时前
milvus笔记、常用表结构
笔记·算法·milvus
liliangcsdn3 小时前
ChromaDB距离计算公式示例
人工智能·算法·机器学习
人道领域3 小时前
【LeetCode刷题日记】242.字母异位词
算法·leetcode·职场和发展
卖男孩的小火柴.3 小时前
java内置方法总结及基础算法
java·算法