Leetcode 350:Intersection of Two Arrays II

Leetcode 350:Intersection of Two Arrays II

Given two arrays, write a function to compute their intersection.

说人话:

求两个数组的交集。

举例1:

Leetcode 350:Intersection of Two Arrays II

举例2:

Leetcode 350:Intersection of Two Arrays II

[法1] Map 记录频次

思路

因为是求交集,所以元素出现的次数是需要进行考虑了。这里笔者考虑到用 Map 这个集合框架来解决这个问题,主要是基于 key-value 的特性。使用 Map 可以记录每个元素出现的频次,然后得出交集。

思路如下:

  • 用一个 Map 存下 nums1 数组,并记录下每次元素出现的频次
  • 判断 nums2 的元素在 Map 中的出现频次
    • 若 > 0,则说明有,将其放到一个临时数组中,并消耗一个频次;
    • 若 = 0,则说明该元素不在 nums1 中,跳过。
  • 复制数组,得到结果
代码
class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {

        //记录 nums1 中的元素及其频次
        Map<Integer,Integer> numCount = new HashMap<>();

        for (int i = 0; i < nums1.length; i++) {
            Integer integer = numCount.get(nums1[i]);
            if (integer == null){
                numCount.put(nums1[i],1);
            }else{
                Integer count = numCount.get(nums1[i]);
                numCount.put(nums1[i],++count);
            }
        }

        //临时数组,长度为 nums1 和 nums2 中短的那个
        int[] result = new int[nums1.length<nums2.length?nums1.length:nums2.length];
        //记录交集中的元素个数
        int count = 0;

        //判断 nums2 中每个元素在 nums1 是否存在
        for (int num: nums2){
            Integer i = numCount.get(num);
            if (i != null && i > 0) {
                //存在的话放到临时数组中
                result[count++]=num;
                //然后消耗一个频次
                numCount.put(num,--i);
            }
        }
        
        //复制数组
        int[] r = new int[count];
        for (int i = 0; i < r.length; i++) {
            r[i] = result[i];
        }

        return r;

    }
}
提交结果
Leetcode 350:Intersection of Two Arrays II
代码分析

不考虑集合框架底层原理的话:

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
上一篇:R双样本t检验(WELCH TWO-SAMPLE T-TEST)


下一篇:75-颜色分类