CS-Wiki CS-Wiki
Home
知识体系总览
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • MySQL
  • Redis
  • 设计模式
  • Java 基础
  • Java 集合
  • Java 并发
  • Java 虚拟机
  • Spring
  • Kafka
  • 校招扫盲
  • 项目推荐
  • 唠唠嗑儿
  • 读书笔记
归档
GitHub (opens new window)
Home
知识体系总览
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • MySQL
  • Redis
  • 设计模式
  • Java 基础
  • Java 集合
  • Java 并发
  • Java 虚拟机
  • Spring
  • Kafka
  • 校招扫盲
  • 项目推荐
  • 唠唠嗑儿
  • 读书笔记
归档
GitHub (opens new window)
  • 刷题模板汇总
  • 一些刷题小技巧
  • 整数 and 位运算

  • 数组

  • 链表

  • 哈希表

    • 哈希表理论基础
    • 剑指 Offer 50 - 第一个只出现一次的字符
    • 验证外星语词典
    • 有效的字母异位词
    • 字母异位词分组
    • 单词长度的最大乘积
    • 两个数组的交集
      • 📃 题目描述
      • 🔔 解题思路
      • 💥 复杂度分析
    • 多个数组求交集
    • 赎金信
    • 快乐数
    • 两数之和
    • 四数相加 II
    • 最小时间差
    • 缺失的第一个正数
    • 最长连续序列
    • 剑指 Offer 03 - 数组中重复的数字
    • 利用哈希表设计高级结构

  • 字符串

  • 栈

  • 队列

  • 二叉树

  • 前缀树

  • 二分查找

  • 双指针法

  • 区间求和问题

  • 排序

  • 回溯算法

  • 贪心算法

  • 动态规划

  • 图

  • 数学

  • 自动机

  • 海量数据和空间限制

  • 05-数据结构与算法
  • 哈希表
小牛肉
2021-09-15
目录

两个数组的交集

# 📃 题目描述

题目链接:349. 两个数组的交集 - 力扣(LeetCode) (leetcode-cn.com) (opens new window)

给定两个数组,编写一个函数来计算它们的交集。

示例 1:

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

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]

说明:

输出结果中的每个元素一定是唯一的。

我们可以不考虑输出结果的顺序。

# 🔔 解题思路

首先我们需要注意的是,两个数组的交集是不包含重复数字的,那最简单的,我们可以将两个数组的交集存在 Set 中,由 Set 来帮我们去重。

那这个题目其实我们需要两个 Set,整体思路如下:

  • 先处理数组 nums1 将其存入一个 Set
  • 遍历数组 nums2,若某个数字在 Set 中存在,则将其存入交集 Set 中
  • 最后返回这个 Set 即可

另外,上一题我们说过,对于哈希表中的 key,如果哈希值比较连续且固定,我们可以用数组的下标来等同,那显然,对于这个题目,不适合用数组来代替哈希表。

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        if (nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) {
            return new int[0];
        }

        // 存储交集
        Set<Integer> resSet = new HashSet<>();

        // 存储 nums1
        Set<Integer> set = new HashSet<>();

        for (int i : nums1) {
            set.add(i);
        }

        for (int i : nums2) {
            if (set.contains(i)) {
                resSet.add(i);
            }
        }

        // set 转 数组
        int[] res = new int[resSet.size()];
        int index = 0;
        for (Integer i : resSet) {
            res[index ++] = i;
        }
        
        return res;
        // 或者直接 return resSet.stream().mapToInt(Integer::intValue).toArray();
    }
}

# 💥 复杂度分析

  • 空间复杂度:用到了两个 Set 和一个数组,空间复杂度为 O(N);
  • 时间复杂度:遍历了一遍 nums1,遍历了一遍 nums2,最后 set 转数组的时候又遍历了一遍 Set,所以总的时间复杂度是 O(N)

🎁 公众号

各位小伙伴大家好呀,叫我小牛肉就行,目前在读东南大学硕士,上方扫码关注公众号「飞天小牛肉」,与你分享我的成长历程与技术感悟~

帮助小牛肉改善此页面 (opens new window)
Last Updated: 2023/02/16, 11:27:10
单词长度的最大乘积
多个数组求交集

← 单词长度的最大乘积 多个数组求交集→

最近更新
01
关于编程满天星
02
让我来告诉你 Java 程序员是怎么一步一步从入行到被裁的
06-08
03
Vision Pro,未来已来
06-06
更多文章>
Theme by Vdoing | Copyright © 2019-2023 飞天小牛肉 | 皖ICP备2022008966号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式