zoukankan      html  css  js  c++  java
  • Leetcode 350. Intersection of Two Arrays II

    Given two arrays, write a function to compute their intersection.

    Example: Given nums1 = [1, 2, 2, 1], nums2 = [2, 2], return [2, 2].

    Note:

    • Each element in the result should appear as many times as it shows in both arrays.
    • The result can be in any order.

     

    Follow up:

    • What if the given array is already sorted? How would you optimize your algorithm?
    • What if nums1's size is small compared to num2's size? Which algorithm is better?
    • What if elements of nums2 are stored on disk, and the memory is limited such that you cannot load all elements into the memory at once?

    解法一:

     1 class Solution {
     2 public:
     3     vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
     4         vector<int> v;
     5         int len2 = nums2.size();
     6         for(int i = 0; i < len2; i++)
     7         {
     8             for(int j = 0; j < nums1.size(); j++)
     9             {
    10                  if(nums2[i] == nums1[j])
    11                  {
    12                     v.push_back(nums2[i]);
    13                     nums1.erase(nums1.begin()+j);
    14                     break;
    15                  }
    16             }
    17         }
    18         return v;
    19     }
    20 };
    View Code

    解法二:

     1 class Solution {
     2 public:
     3     vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
     4         vector<int> intersection;
     5 
     6         if(nums1.empty() || nums2.empty())
     7         {
     8             return intersection;
     9         }
    10 
    11         sort(nums1.begin(), nums1.end());
    12         sort(nums2.begin(), nums2.end());
    13 
    14 
    15         int m = nums1.size();
    16         int n = nums2.size();
    17 
    18         int i = 0,j = 0;
    19         while(i < m && j < n)
    20         {
    21                  if(nums1[i] < nums2[j])
    22                  {
    23                      i++;
    24                  }
    25                  else if(nums1[i] > nums2[j])
    26                  {
    27                      j++;
    28                  }
    29                  else
    30                  {
    31                      intersection.push_back(nums1[i]);
    32                      i++;
    33                      j++;
    34                  }
    35          }
    36 
    37 
    38         return intersection;
    39     }
    40 };
    View Code

    解法三:用hash表, 简单粗暴, 如果是有序的可以不用hash表, 同时扫描两个数组, 找相同的. 如果nums2在磁盘中, 用hash表无影响

     1 class Solution {
     2 public:
     3     vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
     4         if(nums1.size()==0 || nums2.size()==0) return vector<int>();
     5         vector<int> result;
     6         unordered_map<int, int> hash;
     7         for(auto val: nums1) hash[val]++;
     8         for(auto val: nums2)
     9         {
    10             if(hash.count(val) && hash[val]>0) result.push_back(val);
    11             hash[val]--;
    12         }
    13         return result;
    14     }
    15 };
    View Code

    1. 如果不排序,O(mn)。 
    2. 如果m和n都在合理范围内,先排序,再一个一个对比,时间复杂度O(nlgn + mlgm + m+n)。 
    3. 如果m远小于n, 对n排序,m也排序(nlgn+mlgm+m+n),或者m不排序(nlgn + mn)。 这两种都差不多。也可以对m不排序,在n里做binary search,这样复杂度降低为nlgn+mlgn, 降很低。
    4. 如果n很大,n只能存在disk上。只能把m load到内存,然后n一个一个的读进来,和m对比,这时m可以用hash存,这样复杂度就为O(n)了。

  • 相关阅读:
    You have new mail in /var/spool/mail/root
    ./configure: error: C compiler cc is not found
    XAMPP下MYSQL中文乱码问题的解决
    Linux服务器配置秘钥对连接
    linux根分区满了如何处理,查找大文件方法
    Linux下挂载windows的共享文件夹
    zabbix分布式监控系统安装配置
    远程桌面,身份验证错误:要求的函数不正确等解决办法
    Linux之Shell 脚本加密工具-shc
    Shell脚本监控专线Network并SendEmail报警
  • 原文地址:https://www.cnblogs.com/qinduanyinghua/p/5527893.html
Copyright © 2011-2022 走看看