leetcode面试试题:两个数组的交集

两个数组的交集

leetcode面试题


前言

leetcode 练习

一、题目描述

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

示例 1:

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

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

二、解决方法

1.两个集合解决问题

**方法1:**从nums1中一个个挑出值来与nums2中一个个进行对比,挑出其中共有的元素。然而挑出来的元素组成的数组中会有重复。如果不考虑重复情况的话,示例一会输出四个2。考虑重复的话则需要将vector变为set集合,因为集合是不允许出现有相同元素的。

        set<int>s(dd.begin(), dd.end());
        dd.assign(s.begin(), s.end());

但是这样时间复杂度为O(mn)
方法一的改进,可以通过哈希集合存储元素,通过set.count()则可以在O(1) 的时间内判断一个元素是否在集合中,从而降低时间复杂度。

for (auto& num : set1) {
            if (set2.count(num)) {
                intersection.push_back(num);
            }
        }

时间复杂度为O(m+n)。

2.排序 + 双指针

1、首先对两个数组通过sort函数进行排序。

2、设置两个指针分别指向两个数组的头。

3、一开始设置一个preview值与其中一个数组的头元素相等。

4、然后通过两个指针对两个数组的元素进行一一比较,不相等时,数值较小的那一方,指针+1。相等时且不等于preview值时,将这一个值加入到新的数组当中,然后更新preview。如果等于preview值时,两个指针都+1。

5、重复循环直到有一方的数组的长度到了尽头,就取消循环。

vector<int> intersection;
        while (index1 < length1 && index2 < length2) {
            int num1 = nums1[index1], num2 = nums2[index2];
            if (num1 == num2) {
                // 保证加入元素的唯一性
                if (!intersection.size() || num1 != intersection.back()) {
                    intersection.push_back(num1);
                }
                index1++;
                index2++;
            } else if (num1 < num2) {
                index1++;
            } else {
                index2++;
            }
        }

时间复杂度:O(m \log m+n \log n)O(mlogm+nlogn),其中 mm 和 nn 分别是两个数组的长度。对两个数组排序的时间复杂度分别是 O(m \log m)O(mlogm) 和 O(n \log n)O(nlogn),双指针寻找交集元素的时间复杂度是 O(m+n)O(m+n),因此总时间复杂度是 O(m \log m+n \log n)O(mlogm+nlogn)。

空间复杂度:O(\log m+\log n)O(logm+logn),其中 mm 和 nn 分别是两个数组的长度。空间复杂度主要取决于排序使用的额外空间。

总结

1、c++中vector的用法。vector的各种用法

2、c++中set的几种用法

3、双指针的用法

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值