LeetCode 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. 定义一个ordered_map对象m及容器res(作为返回值);
  2. 遍历容器nums1,将每个元素值作为关键字插入到m中,对于重复出现的元素,将其对应的值自加1;
  3. 遍历容器nums2,在m中查找其关键字对应的值是否大于0,将其push到res中,并将其对应的值自减1。
class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        unordered_map<int, int> m;
        vector<int> res;
        for(auto num1 : nums1)
            ++m[num1];
        for(auto num2 : nums2)
        {
            if (m[num2]-- > 0)
                res.push_back(num2);
        }
        return res;
    }
};

题解二:

此法使用双指针策略,

  1. 利用sort函数将nums1和nums2排序;
  2. 将双指针分别置于两个容器的首地址;
  3. 策略:

    1)当两指针指向的元素相等时,将其push到res中,同时双指针均自加1;

    2)当其中一元素较大时,将较小元素的指针自加1;

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        vector<int> res;
        int i = 0, j = 0;
        sort(nums1.begin(), nums1.end());
        sort(nums2.begin(), nums2.end());
        while(i < nums1.size() && j < nums2.size())
        {
            if (nums1[i] == nums2[j])
            {
                res.push_back(nums1[i]);
                ++i;
                ++j;
            }
            else if (nums1[i] > nums2[j])
                ++j;
            else
                ++i;
        }
        return res;
    }
};
  • 如果给定的数组已经排好序呢?你将如何优化你的算法?

    对于方法一,没有优化的情况;

    对于方法二,可考虑数据规模的处理。

  • 如果 nums1 的大小比 nums2 小很多,哪种方法更优?

    方法一更优,方法二的排序可能无必要性。

  • 如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

    对于方法一,可以先从内存中取出一部分进行处理,之后再取,直至完成;

    对于方法二,没有办法。

参考:

https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/1/array/26/

https://github.com/grandyang/leetcode/issues/350

原文地址:https://www.cnblogs.com/Eagleeye1105/p/11663381.html

时间: 2024-10-03 19:14:11

LeetCode 350. 两个数组的交集II的相关文章

前端与算法 leetcode 350. 两个数组的交集 II

目录 # 前端与算法 leetcode 350. 两个数组的交集 II 题目描述 概要 提示 解析 解法一:哈希表 解法二:双指针 解法三:暴力法 算法 # 前端与算法 leetcode 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] 说明

【Leetcode】【简单】【350. 两个数组的交集 II】【JavaScript】

题目描述 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 的大小比 nu

力扣LeetCode,两个数组的交集 II

1.给定两个数组,编写一个函数来计算它们的交集. 示例 1: 1 输入: nums1 = [1,2,2,1], nums2 = [2,2] 2 输出: [2,2] 示例 2: 1 输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4] 2 输出: [4,9] 说明: 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致. 我们可以不考虑输出结果的顺序. 进阶: 如果给定的数组已经排好序呢?你将如何优化你的算法? 如果 nums1 的大小比 nums2 小很多

Leetcode 350.两个数组的交集|| By Python

给定两个数组,编写一个函数来计算它们的交集. 示例 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 小很多,哪种方法更优?

领扣(LeetCode)两个数组的交集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 小很多,哪种方法更优? 如

两个数组的交集 II [ LeetCode - 350 ]

原题地址:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii/description/ 给定两个数组,写一个方法来计算它们的交集. 例如: 给定 nums1 = [1, 2, 2, 1], nums2 = [2, 2], 返回 [2, 2]. 注意: 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致. 我们可以不考虑输出结果的顺序. 跟进: 如果给定的数组已经排好序呢?你将如何优化你的算法? 如果 nums

350 Intersection of Two Arrays II 两个数组的交集 II

给定两个数组,写一个方法来计算它们的交集.例如:给定 nums1 = [1, 2, 2, 1], nums2 = [2, 2], 返回 [2, 2].注意:       输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致.       我们可以不考虑输出结果的顺序.跟进:    如果给定的数组已经排好序呢?你将如何优化你的算法?    如果 nums1 的大小比 nums2 小很多,哪种方法更优?    如果nums2的元素存储在磁盘上,内存是有限的,你不能一次加载所有的元素到内存

leetcode 两个数组的交集 II

给定两个数组,写一个方法来计算它们的交集. 例如: 给定 nums1 = [1, 2, 2, 1], nums2 = [2, 2], 返回 [2, 2]. /** * @param {number[]} nums1 * @param {number[]} nums2 * @return {number[]} */ var intersect = function (nums1, nums2) { let arr = []; for (let i = 0; i !== nums1.length;

[LeetCode]数组——两个数组的交集 II

给定两个数组,写一个方法来计算它们的交集. C++ class Solution { public: vector<int> intersect(vector<int>& nums1, vector<int>& nums2) { unordered_map<int, int> m; vector<int> res; for (auto a : nums1) m[a]++; for (auto a : nums2) { if (m[