• 哈希表3——两个数组的交集


    例题

    力扣题目链接:[https://leetcode.cn/problems/intersection-of-two-arrays/]

    题目说明:

    示例 1:

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

    示例 2:

    输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
    输出:[9,4]
    解释:[4,9] 也是可通过的
    
    • 1
    • 2
    • 3

    提示:

    1 <= nums1.length, nums2.length <= 1000
    0 <= nums1[i], nums2[i] <= 1000
    
    • 1
    • 2

    解题方法

    方法1:集合

    思路:先将数组转成set,然后遍历长度小的set,判断set1``中的元素是否存在于``set2中,存在的话就是其中一个交集。
    复杂度:时间复杂度 O ( m + n ) O(m+n) O(m+n)mn是两数组的长度,数组转成集合的时间复杂度就是数组的长度,遍历寻找交集的复杂度是 O ( m i n ( m , n ) ) O(min(m,n)) O(min(m,n))。空间复杂度 O ( m + n ) O(m+n) O(m+n),就是两个set的空间
    JAVA

    class Solution {
        public int[] intersection(int[] nums1, int[] nums2) {
            Set<Integer> set1 = new HashSet<Integer>();
            Set<Integer> set2 = new HashSet<Integer>();
            for (int num : nums1) {
                set1.add(num);
            }
            for (int num : nums2) {
                set2.add(num);
            }
            return getIntersection(set1, set2);
        }
    
        public int[] getIntersection(Set<Integer> set1, Set<Integer> set2) {
            if (set1.size() > set2.size()) {
                return getIntersection(set2, set1);
            }
            Set<Integer> intersectionSet = new HashSet<Integer>();
            for (int num : set1) {
                if (set2.contains(num)) {
                    intersectionSet.add(num);
                }
            }
            int[] intersection = new int[intersectionSet.size()];
            int index = 0;
            for (int num : intersectionSet) {
                intersection[index++] = num;
            }
            return intersection;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    方法2:排序+双指针

    思路:数组排序,然后用两个指针分别遍历数组,如果两个指针指向的元素相等 就是其中一个交集,否则比较两个指针指向的元素的大小,较小的向前移动
    复杂度:时间复杂度 O ( m l o g m + n l o g n ) O(mlogm+nlogn) O(mlogm+nlogn),两数组快排时间复杂度分别是 O ( m l o g m ) O(mlogm) O(mlogm) O ( n l o g n ) O(nlogn) O(nlogn),双指针遍历需要 O ( m + n ) O(m+n) O(m+n),复杂度取决于较大的 O ( m l o g m + n l o g n ) O(mlogm+nlogn) O(mlogm+nlogn)。空间复杂度 O ( l o g m + l o g n ) O(logm+logn) O(logm+logn)排序使用的额外空间.。

    代码
    Java

    class Solution {
        public int[] intersection(int[] nums1, int[] nums2) {
            Arrays.sort(nums1);
            Arrays.sort(nums2);
            int length1 = nums1.length, length2 = nums2.length;
            int[] intersection = new int[length1 + length2];
            int index = 0, index1 = 0, index2 = 0;
            while (index1 < length1 && index2 < length2) {
                int num1 = nums1[index1], num2 = nums2[index2];
                if (num1 == num2) {
                    if (index == 0 || num1 != intersection[index - 1]) {
                        intersection[index++] = num1;
                    }
                    index1++;
                    index2++;
                } else if (num1 < num2) {
                    index1++;
                } else {
                    index2++;
                }
            }
            return Arrays.copyOfRange(intersection, 0, index);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    c++

    class Solution {
    public:
        vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
            unordered_set<int> result_set; // 存放结果
            unordered_set<int> nums_set(nums1.begin(), nums1.end());
            for (int num : nums2) {
                // 发现nums2的元素 在nums_set里又出现过
                if (nums_set.find(num) != nums_set.end()) {
                    result_set.insert(num);
                }
            }
            return vector<int>(result_set.begin(), result_set.end());
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 相关阅读:
    学完高性能计算后的发展怎么样?
    SpringBoot配置文件(properties、yml、yaml)
    java毕业设计的社会公益平台mybatis+源码+调试部署+系统+数据库+lw
    2024中国(北京)国际人工智能展览会(世亚智博会)
    [云原生]微服务架构是什么?
    4. Java IO
    小狐狸ChatGPT付费创作系统V2.0.4智能问答小程序,修复一个pc版的bug
    Linux进程通信-POSIX IPC
    Golang开发软件
    常见排序算法讲解(图解+代码+代码讲解)
  • 原文地址:https://blog.csdn.net/wtlll/article/details/125393483