LeetCode 349. Intersection of Two Arrays 解题报告

LeetCode 349. Intersection of Two Arrays 解题报告

题目描述

Given two arrays, write a function to compute their intersection.
- Each element in the result must be unique.
- The result can be in any order.


示例

Given nums1 = [1, 2, 2, 1], nums2 = [2, 2], return [2].


限制条件

没有明确给出。


解题思路

我的思路:

找相同元素的题目,我的第一个感觉都是用set去解决。对于这道题,先遍历一下nums1并将nums1的元素放入到set中,set保证了元素的唯一性(已存在的元素不会被再次插进去)。然后遍历nums2并判断nums2的元素是否在set中,在就添加该元素到结果数组,并且从set中删除该元素,避免重复添加元素。

其他思路:

这道题目也可以用排序加双指针来解决。
对nums1和nums2进行排序。分别设置i,j指针指向两个数组的首位,判断nums1[i]和nums2[j]的大小关系:
- nums1[i] < nums2[j],增加i
- nums1[i] > nums2[j],增加j
- nums1[i] == nums2[j], 当且仅当结果数组为空或是还没有这个元素,就添加nums1[i]。最后增加i和j。
进行上述过程直到i,j中的一个越过了数组范围。

这道题还有其他解法,比如二分法查找等,但我一开始用set通过了,然后用排序加双指针也过了一遍,其他的没有尝试,下面只给出这两种解法的代码。


代码

我的代码
class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        set<int> nums;
        vector<int> intersection;

        for (auto n: nums1) {
            if (nums.find(n) == nums.end())
                nums.insert(n);
        }

        for (auto n: nums2) {
            if (nums.find(n) != nums.end()) {
                intersection.push_back(n);
                nums.erase(n);
            }
        }

        return intersection;
    }
};
参考代码
class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        sort(nums1.begin(), nums1.end());
        sort(nums2.begin(), nums2.end());

        vector<int> nums;

        for (int i = 0, j = 0; i < nums1.size() && j < nums2.size(); ) {
            if (nums1[i] < nums2[j]) {
                i++;
            }
            else if (nums1[i] > nums2[j]) {
                j++;
            }
            else {
                if (nums.empty() || nums[nums.size() - 1] != nums1[i])
                    nums.push_back(nums1[i]);
                i++;
                j++;
            }
        }

        return nums;
    }
};

总结

这道题还是比较简单的,解法也不唯一,有时间可以尽量多完成几个不同的算法。
轻松填完一个坑,继续下一个!加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值