zoukankan      html  css  js  c++  java
  • 350. 两个数组的交集 II-7月13日

    题目

    350. 两个数组的交集 II

    我的思路

    我最开始的思路:外循环遍历数组1,对于每个数组1的元素,在数组2中找是否有相同的元素,若有添加到新数组并从数组2删除。时间复杂度是m*n。

    借用哈希表,可以降低再数组2中找相同元素的复杂度,代价是需要是为数组2构造一个哈希表。其中哈希表的key是元素的值,value是元素在数组中出现的次数。若数组2中存在与当前遍历的数组1中相同的元素,把key值-1。时间复杂度是m+n。空间复杂度是n(哈希表)。

    如果给定的数组已经排好序,可以用滑动窗口的思想:从小到大遍历数组1中的元素,在数组2中设一个指针,最开始指向数组2最小的元素。若当前遍历的数组1中的元素与数组2中指针当前指向的元素不匹配,那么指针右移;若匹配(相同),数组1中的指针与数组2中的指针同时右移。直到两个指针都达到最右端。时间复杂度是m+n(不包括排序的时间代价)。
    如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中:意味着对数组2进行排序会有大量的IO代价。所以最好为数组1建立哈希表,遍历数组2,只进行必要的IO操作。

    我的实现

    class Solution {
    public:
        vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
            vector<int> results;
            for(auto it : nums1){
                auto temp_it=find(nums2.begin(),nums2.end(),it);
                if(temp_it!=nums2.end()){
                    results.push_back(it);
                    nums2.erase(temp_it);
                }
            }
            return results;
        }
    };
    //外循环遍历数组1,对于每个数组1的元素,在数组2中找是否有相同的元素,若有添加到新数组并从数组2删除;
    //1.如果给定的数组已经排好序,可以用滑动窗口的思想:从小到大遍历数组1中的元素,在数组2中设一个指针,最开始指向数组2最小的元素。若当前遍历的数组1中的元素与数组2中指针当前指向的元素不匹配,那么指针右移;若匹配(相同),数组1中的指针与数组2中的指针同时右移。直到两个指针都达到最右端
    //3.数组2元素的遍历作为外循环,减少IO次数

    拓展学习

    记住可以借助哈希表来降低查找元素的时间复杂度

  • 相关阅读:
    EventBus--介绍
    EventBus--出现的问题
    File存对象--android 的File存储到SD卡();
    SharePrecences--(json+sharePrecences)存list 或对象
    缓存AsimpleCache -- 解决Android中Sharedpreferences无法存储List数据/ASimpleCache
    ViewPager--左右可滑动的
    git之win安装git和环境配置及常用命令总结
    mySql事务_ _Java中怎样实现批量删除操作(Java对数据库进行事务处理)?
    eclispe---快捷键设置
    bug_ _org.json.JSONException: End of input at character 0 of
  • 原文地址:https://www.cnblogs.com/BoysCryToo/p/13291976.html
Copyright © 2011-2022 走看看