• 算法 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

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

  • 相关阅读:
    STM32,复位和时钟控制
    PAT 1029 Median(25分)
    安卓场景开发(一) 引导页面
    港科夜闻|国务院发文指出将打造重大科技创新平台,稳步推进粤港澳教育合作,加快与香港科大、中科院共建省实验室...
    一文带你走进 Linux 小工具 - tmux
    理解Window和WindowManager(一)
    小程序中Java后台调用getAccessToken接口、msg_sec_check接口检测文本安全、小程序前端访问后端接口的方法
    强化学习:Actor-Critic、SPG、DDPG、MADDPG
    Unity 设置Inspect上问号的跳转链接
    部署LVS-DR+Keepalived高可用群集构建
  • 原文地址:https://blog.csdn.net/caspar_notes/article/details/134522299