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

总结

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

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

相关推荐
地平线开发者30 分钟前
不是线程越多越快:用 hrt_model_exec 在 征程6M 上给 YOLOv5x 建立性能基线
算法
姜鱼问生1 小时前
fail2ban 实战:从默认配置到生产可用
后端·算法·架构
垆边人似月.1 小时前
华为题:全排列
算法·深度优先·图论
杜 硕1 小时前
快速排序详解01
数据结构·算法·排序算法
Matlab程序猿2 小时前
【MATLAB源码-第459期】基于matlab的D-H模型与阻尼最小二乘逆运动学的六自由度机械臂五次轨迹规划及动力学前馈PD控制仿真。
人工智能·算法·matlab·d-h建模·六自由度串联机械臂
信奥卷王2 小时前
[GESP202606 六级] 满二叉树
数据结构·算法
积流成海2 小时前
用代码实现哈希计算器:Web Crypto API 实战
前端·算法·哈希算法·哈希函数·盘子工具站
Nil2082 小时前
leetcode 300最长递增子序列
算法·leetcode·职场和发展
垆边人似月.3 小时前
华为机试题 :最大数
c++·算法·华为
zhenaibo5213 小时前
如何与导师有效沟通选题?
算法