美文网首页
leetcode--350--两个数组的交集 II

leetcode--350--两个数组的交集 II

作者: minningl | 来源:发表于2021-01-29 18:48 被阅读0次

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

示例 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 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

链接:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii

思路:
1、首先拿到两个数组去重后的交集
2、对去重后的交集,复制n份,n等于其在2个数组中出现的最小次数

Python代码:

class Solution(object):
    def intersect(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: List[int]
        """
        ls = set(nums1) & set(nums2)

        ret = []
        for item in ls:
            for i in range(min(nums1.count(item), nums2.count(item))):
                ret.append(item)
        return ret

C++代码:

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        set<int> set1{nums1.begin(), nums1.end()};
        set<int> set2{nums2.begin(), nums2.end()};

        set<int> ls;
        for (int item:set1){
            if(find(set2.begin(), set2.end(), item)!=set2.end()){
                ls.insert(item);
            }
        }
        vector<int> ret;
        for (int item:ls){
            int item_num1 = count(nums1.begin(),nums1.end(),item);
            int item_num2 = count(nums2.begin(),nums2.end(),item);
            int count = min(item_num1, item_num2);
            for (int i=0; i<count; i++){
                ret.push_back(item);
            }
        }
        return ret;
    }
};

思路2:
1、对于排序后的数组采用滑动窗口的做法

Python代码:

class Solution(object):
    def intersect(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: List[int]
        """
        nums1.sort()
        nums2.sort()

        l1, l2 = 0, 0

        ret = []
        while l1<len(nums1) and l2<len(nums2):
            if nums1[l1]==nums2[l2]:
                ret.append(nums1[l1])
                l1 += 1
                l2 += 1
            elif nums1[l1] > nums2[l2]:
                l2 += 1
            else:
                l1 += 1
        return ret 

C++代码:

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        
        sort(nums1.begin(), nums1.end());
        sort(nums2.begin(), nums2.end());

        int l1=0;
        int l2=0;

        vector<int> ret;
        while (l1<nums1.size() && l2<nums2.size()){
            if(nums1[l1]==nums2[l2]){
                ret.push_back(nums1[l1]);
                l1 += 1;
                l2 += 1;
            }else if (nums1[l1]>nums2[l2]){
                l2 += 1;
            }else{
                l1 += 1;
            }
        }
        return ret;
    }
};

相关文章

网友评论

      本文标题:leetcode--350--两个数组的交集 II

      本文链接:https://www.haomeiwen.com/subject/exfjrktx.html