• 【初级算法】6. 两个数组的交集 II


    题目如下:

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

    解题思路:

    1.用hash即可。将数组1中元素全部插入到hash列表中,然后对数组2中的每个元素进行查找即可。时间复杂度为O(n),空间复杂度为O(N)。

    代码如下:

    class Solution {
    public:
        vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
            map<int,int> cnt1;
            map<int,int> cnt2;
            vector<int> ret;
            
            for(int i = 0;i < nums1.size();++i){
                if(cnt1.find(nums1[i])!=cnt1.end()){  
                    cnt1[nums1[i]]++;  
                }  
                else{  
                    cnt1[nums1[i]] = 1;  
                }   
            }
            
            for(int i = 0;i < nums2.size();++i){
                if(cnt2.find(nums2[i])!=cnt2.end()){  
                    cnt2[nums2[i]]++;  
                }  
                else{  
                    cnt2[nums2[i]] = 1;  
                }  
            }
            
            map<int,int>::iterator it1;
            map<int,int>::iterator it1;
            for(it1 = cnt1.begin();it1!= cnt1.end();++it1){
                it2 = cnt1.find(it1->first);
                if(it2!=cnt2.end()){
                    if(it2->second == it1->second){
                        for(int i = 0;i < it1->second; ++i){
                            ret.push_back(it1->first);
                        }
                    }
                }
                    
                
            }
            
            return ret;
        }
    };

    2.排序好的数组。对两个数组排序好的元素依次遍历即可找到两个数组中相同的元素。

    C++代码如下:

    class Solution {
    public:
        vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
            sort(nums1.begin(),nums1.end());
            sort(nums2.begin(),nums2.end());
            vector<int> res;
            
            int l1 = 0;
            int l2 = 0;
            
            while(l1 < nums1.size()&&l2 < nums2.size()){
                if(nums1[l1] == nums2[l2]){
                    res.push_back(nums1[l1]);
                    ++l1;
                    ++l2;
                }else if(nums1[l1] > nums2[l2]){
                    ++l2;
                }else{
                    ++l1;
                }
            }
            
            return res;
        }
    };
  • 相关阅读:
    yii2.0缓存的使用
    yii2.0框架where条件的使用
    yii2.0自带验证码使用
    spring中MessageSource的配置使用方法1[转]
    DOM、JDOM、DOM4J的区别
    探秘Java虚拟机——内存管理与垃圾回收
    MySQL开发规范和原则大全
    Java Classloader机制解析
    Junit之测试顺序---FixMethodOrder
    MySQL的btree索引和hash索引的区别
  • 原文地址:https://www.cnblogs.com/mikemeng/p/8983674.html
Copyright © 2020-2023  润新知