美文网首页
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