Leetcode:350. 两个数组的交集 II

350. 两个数组的交集 II

题目描述

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

示例 1:

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

示例 2:

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

说明:

输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
我们可以不考虑输出结果的顺序。

进阶:

如果给定的数组已经排好序呢?你将如何优化你的算法?
如果 nums1 的大小比 nums2 小很多,哪种方法更优?
如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

思路

思路1: 两个数组排序后使用两个指针遍历比较

对两个数组分别排序,然后使用一个哨兵分别计数,若两位置相等则加入,否则按照排序递增

思路2: 使用Hash计数

对一个数组hash计数,然后使用另外一个等相等加入

代码

代码1

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        List result = new ArrayList<>();
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        
        int aIndex = 0;
        int bIndex = 0;
        while(aIndex < nums1.length && bIndex < nums2.length){
            if (nums1[aIndex] == nums2[bIndex]){
                result.add(nums1[aIndex]);
                aIndex ++;
                bIndex ++;
            } else if(nums1[aIndex] < nums2[bIndex]){
                aIndex ++;
            } else {
                bIndex ++;
            }
        }
        int[] intResult = new int[result.size()];
        for(int i = 0; i < result.size(); i++){
            intResult[i] = result.get(i);
        }
        return intResult;
    }
}

代码2

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        List result = new ArrayList<>();
        Map hashMap = new HashMap<>();
        for(int num: nums1){
            if (!hashMap.containsKey(num)){
                hashMap.put(num, 0);
            }
            hashMap.put(num, hashMap.get(num) + 1);
        }
        for(int num: nums2){
            if (hashMap.containsKey(num) && hashMap.get(num) > 0){
                result.add(num);
                hashMap.put(num, hashMap.get(num) - 1);
            }
        }
        int[] intResult = new int[result.size()];
        for(int i = 0; i < result.size(); i++){
            intResult[i] = result.get(i);
        }
        return intResult;
    }
}

复杂度分析

思路1时间复杂度

$O(nlog(n))$

思路1空间复杂度

$O(n)$

思路1时间复杂度

$O(n)$

思路1空间复杂度

$O(n)$


文章作者: 小风雷
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小风雷 !
评论
 上一篇
Leetcode:334. 递增的三元子序列 Leetcode:334. 递增的三元子序列
334. 递增的三元子序列题目描述给定一个未排序的数组,判断这个数组中是否存在长度为 3 的递增子序列。 数学表达式如下: 如果存在这样的 i, j, k, 且满足 0 ≤ i < j < k ≤ n-1, 使得 arr[
2020-03-27
下一篇 
Leetcode:384.打乱数组 Leetcode:384.打乱数组
Leetcode: 384.打乱数组题目描述打乱一个没有重复元素的数组。 示例:// 以数字集合 1, 2 和 3 初始化数组。 int[] nums = {1,2,3}; Solution solution = new
2020-03-27
  目录