每日一题——349. 两个数组的交集

简介: 每日一题——349. 两个数组的交集

349. 两个数组的交集

力扣349

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

网络异常,图片无法展示
|

代码思路

注意题目特意说明:输出结果中的每个元素一定是唯一的,也就是说输出的结果的去重的, 同时可以不考虑输出结果的顺序

这道题用暴力的解法时间复杂度是O(n^2),那来看看使用哈希法进一步优化。

但是要注意,使用数组来做哈希的题目,是因为题目都限制了数值的大小。

而这道题目没有限制数值的大小,就无法使用数组来做哈希表了。

而且如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费。

此时就要使用另一种结构体了,set ,关于set,C++ 给提供了如下三种可用的数据结构:

  • std::set
  • std::multiset
  • std::unordered_set

std::set和std::multiset底层实现都是红黑树,std::unordered_set的底层实现是哈希表, 使用unordered_set 读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set。

思路如图所示:

网络异常,图片无法展示
|

Java版本代码:

import java.util.Set;
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> set1 = new HashSet<>();
        Set<Integer> resSet = new HashSet<>();
        for (int i : nums1) {
            set1.add(i);
        }
        for (int i : nums2) {
            if (set1.contains(i)) {
                resSet.add(i);
            }
        }
        int[] resArr = new int[resSet.size()];
        int index = 0;
        for (int i : resSet) {
            resArr[index++] = i;
        }
        return resArr;
    }
}
复制代码

拓展

直接使用set 不仅占用空间比数组大,而且速度要比数组慢,set把数值映射到key上都要做hash计算的。



目录
相关文章
|
6月前
|
Java C++ Python
leetcode-349:两个数组的交集
leetcode-349:两个数组的交集
45 1
【Leetcode -349.两个数组的交集 -350.两个数组的交集Ⅱ】
【Leetcode -349.两个数组的交集 -350.两个数组的交集Ⅱ】
38 0
|
1月前
|
C++
【LeetCode 12】349.两个数组的交集
【LeetCode 12】349.两个数组的交集
16 0
|
6月前
|
Java
LeetCode_349. 两个数组的交集
LeetCode_349. 两个数组的交集
56 0
|
6月前
|
C#
【力扣每日一题/02】349. 两个数组的交集
【力扣每日一题/02】349. 两个数组的交集
|
存储
LeetCode-两个数组的交集 II
LeetCode-两个数组的交集 II
两个数组的交集(力扣刷题)
两个数组的交集(力扣刷题)
leetcode 349 两个数组的交集
leetcode 349 两个数组的交集
87 0
leetcode 349 两个数组的交集
|
存储 算法
LeetCode 350. 两个数组的交集 II
给定两个数组,编写一个函数来计算它们的交集。
93 0