• 算法 LeetCode 题解 | 两个数组的交集


    大家好,我是木川

    一、题目描述

    给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

    示例 1:

    1. 输入:nums1 = [1,2,2,1], nums2 = [2,2]
    2. 输出:[2]

    示例 2:

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

    提示:

    • 1 <= nums1.length, nums2.length <= 1000

    • 0 <= nums1[i], nums2[i] <= 1000

    二、题解

    一)哈希表

    思路:

    1、遍历数组1,使用辅助哈希表存储已有元素

    2、遍历数组2,如果遍历元素在哈希表中存在,则保存到结果数组中

    代码:

    1. func intersection(nums1 []int, nums2 []int) []int {
    2.     set := make(map[int]struct{})
    3.     res := make([]int0)
    4.     for _, v := range nums1 {
    5.         set[v] = struct{}{}
    6.     }
    7.     for _, v := range nums2 {
    8.         if _, ok := set[v]; ok {
    9.             res = append(res, v)
    10.             // 去重
    11.             delete(set, v)
    12.         }
    13.     }
    14.     return res
    15. }

    时间复杂度:O(n)

    空间复杂度:O(n)

    二)排序 + 双指针

    如果两个数组是有序的,则可以使用双指针的方法得到两个数组的交集

    思路:

    1、首先对两个数组进行排序

    2、两个指针分别指向两个数组的头部,每次比较两个指针指向的两个数组中的数字,如果两个数字不相等,则将指向较小数字的指针右移一位,如果两个数字相等,将该数字添加到答案,同时将两个指针都右移一位

    代码:

    1. func intersection(nums1 []int, nums2 []int) (res []int) {
    2.     sort.Ints(nums1)
    3.     sort.Ints(nums2)
    4.     for i, j := 00; i < len(nums1) && j < len(nums2); {
    5.         x, y := nums1[i], nums2[j]
    6.         if x == y {
    7.             // 去除重复(相同的元素)
    8.             if res == nil || x != res[len(res)-1] {
    9.                 res = append(res, x)
    10.             }
    11.             i++
    12.             j++
    13.         } else if x < y {
    14.             i++
    15.         } else {
    16.             j++
    17.         }
    18.     }
    19.     return res
    20. }

    时间复杂度:O(mlog⁡m+nlog⁡n),其中 m 和 n 分别是两个数组的长度,对两个数组排序的时间复杂度分别是 O(mlog⁡m) 和 O(nlogn),双指针寻找交集元素的时间复杂度是 O(m+n),因此总时间复杂度是 O(mlog⁡m+nlog⁡n)

    空间复杂度:排序使用的额外空间 O(log⁡m+log⁡n),其中 m 和 n 分别是两个数组的长度。

    今天的分享就到这里了,加下面微信拉你进编程技术交流群

    8c61fbde7cc04edb1e060206f7a63c76.png

    如果对你有帮助,帮我点一下在看或转发,欢迎关注我的公众号

  • 相关阅读:
    Centos8安装部署JumpServer堡垒机
    入坑机器学习:三,非监督学习
    继续读研大学借的助学贷款怎么办
    软件系统建模&架构风格-架构论文(三十八)
    Shiro学习笔记(四):Shiro中的授权
    【深度学习实验】循环神经网络(四):基于 LSTM 的语言模型训练
    WPF入门教程系列二十八 ——DataGrid使用示例MVVM模式(6)
    猿创征文|Android常用知识总结
    关于 Nginx 的哪些事
    svn迁移到git实际操作(亲测有效)
  • 原文地址:https://blog.csdn.net/caspar_notes/article/details/134522299