洋仔的博客 洋仔的博客
首页
  • 个人心法总结

    • 价值心法
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • iOS基础知识
  • 前端
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 投资体系
  • 毛选
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

洋仔

奋斗的小青年
首页
  • 个人心法总结

    • 价值心法
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • iOS基础知识
  • 前端
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 投资体系
  • 毛选
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 技术文档

  • GitHub技巧

  • Nodejs

  • 博客搭建

  • iOS基础知识

    • iOS底层相关

    • Runloop系列

    • Runtime系列

    • 内存管理系列

    • Block系列

    • 线程系列

    • KVC跟KVO系列以及通知中心

    • UI系列

    • 离屏渲染系列

    • 组件化系列跟架构

    • OC跟webview交互系列

    • 持久化系列

    • APP编译系列

    • APP性能优化系列

    • cocoapods系列

    • swift系列

    • Git系列

    • 网络相关

    • 三方库系列

    • 系统原理

    • 总结系列

    • 算法系列

    • 数据结构系列

      • 数组系列

        • 数组
        • 数组双指针系列之快慢指针
        • 数组双指针系列之对撞指针
        • 数组双指针系列之分离双指针
          • 一. 分离双指针
            • 1.1 分离双指针求解步骤
            • 1.2 分离双指针伪代码模板
            • 1.3 分离双指针使用范围
            • 1.4 两个数组的交集]
          • 1.5. 双指针总结
          • 分离双指针题目
        • 数组滑动窗口系列
      • 链表系列

      • 堆栈系列

      • 队列系列

      • 哈希表

      • 字符串系列

      • 树

      • 图

      • 构建知识体系核心思想
  • 前端

  • 技术
  • iOS基础知识
  • 数据结构系列
  • 数组系列
洋仔
2024-10-25
目录

数组双指针系列之分离双指针

# 一. 分离双指针

分离双指针:两个指针分别属于不同的数组,两个指针分别在两个数组中移动。

分离双指针

# 1.1 分离双指针求解步骤

  1. 使用两个指针 left​1、left​2。left​1 指向第一个数组的第一个元素,即:left​1=0,left​2 指向第二个数组的第一个元素,即:left​2=0。
  2. 当满足一定条件时,两个指针同时右移,即 left​1+=1、left​2+=1。
  3. 当满足另外一定条件时,将 left​1 指针右移,即 left​1+=1。
  4. 当满足其他一定条件时,将 left​2 指针右移,即 left​2+=1。
  5. 当其中一个数组遍历完时或者满足其他特殊条件时跳出循环体。

# 1.2 分离双指针伪代码模板

left_1 = 0
left_2 = 0

while left_1 < len(nums1) and left_2 < len(nums2):
    if 一定条件 1:
        left_1 += 1
        left_2 += 1
    elif 一定条件 2:
        left_1 += 1
    elif 一定条件 3:
        left_2 += 1
1
2
3
4
5
6
7
8
9
10
11

# 1.3 分离双指针使用范围

分离双指针一般用于处理有序数组合并,求交集、并集问题。

下面我们根据具体例子来讲解如何使用分离双指针来解决问题。

# 1.4 两个数组的交集]

# 1.4.1 题目链接

  • 349. 两个数组的交集 - 力扣(LeetCode) (opens new window)

# 1.4.2 题目大意

描述:给定两个数组 nums1 和 nums2。

要求:返回两个数组的交集。重复元素只计算一次。

说明:

  • 1≤nums1.length,nums2.length≤1000。
  • 0≤nums1[i],nums2[i]≤1000。

示例:

  • 示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
示例 2:
1
2
3
  • 示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的
1
2
3

# 1.4.3 解题思路

# 思路 1:分离双指针
  1. 对数组 nums1、nums2 先排序。
  2. 使用两个指针 left​1、left​2。left​1 指向第一个数组的第一个元素,即:left​1=0,left​2 指向第二个数组的第一个元素,即:left​2=0。
  3. 如果 nums1[left​1]==nums2[left​2],则将其加入答案数组(注意去重),并将 left​1 和 left​2 右移。
  4. 如果 nums1[left​1]<nums2[left​2],则将 left​1 右移。
  5. 如果 nums1[left​1]>nums2[left​2],则将 left​2 右移。
  6. 最后返回答案数组。
# 思路 1:代码
class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        nums1.sort()
        nums2.sort()

        left_1 = 0
        left_2 = 0
        res = []
        while left_1 < len(nums1) and left_2 < len(nums2):
            if nums1[left_1] == nums2[left_2]:
                if nums1[left_1] not in res:
                    res.append(nums1[left_1])
                left_1 += 1
                left_2 += 1
            elif nums1[left_1] < nums2[left_2]:
                left_1 += 1
            elif nums1[left_1] > nums2[left_2]:
                left_2 += 1
        return res
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 思路 1:复杂度分析
  • 时间复杂度:O(n)。
  • 空间复杂度:O(1)。

# 1.5. 双指针总结

双指针分为「对撞指针」、「快慢指针」、「分离双指针」。

  • 对撞指针:两个指针方向相反。适合解决查找有序数组中满足某些约束条件的一组元素问题、字符串反转问题。
  • 快慢指针:两个指针方向相同。适合解决数组中的移动、删除元素问题,或者链表中的判断是否有环、长度问题。
  • 分离双指针:两个指针分别属于不同的数组 / 链表。适合解决有序数组合并,求交集、并集问题。

# 分离双指针题目 (opens new window)

题号 标题 题解 标签 难度
0350 两个数组的交集 II (opens new window) Python (opens new window) 数组、哈希表、双指针、二分查找、排序 简单
0925 长按键入 (opens new window) Python (opens new window) 双指针、字符串 简单
0844 比较含退格的字符串 (opens new window) Python (opens new window) 栈、双指针、字符串、模拟 简单
1229 安排会议日程 (opens new window) Python (opens new window) 数组、双指针、排序 中等
0415 字符串相加 (opens new window) Python (opens new window) 数学、字符串、模拟 简单
0392 判断子序列 (opens new window) Python (opens new window) 双指针、字符串、动态规划 简单
编辑 (opens new window)
数组双指针系列之对撞指针
数组滑动窗口系列

← 数组双指针系列之对撞指针 数组滑动窗口系列→

最近更新
01
数组
10-25
02
数组双指针系列之对撞指针
10-25
03
数组双指针系列之快慢指针
10-25
更多文章>
Theme by Vdoing | Copyright © 2019-2024 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式