p73 两个数组的交集II (leetcode350)

一:解题思路

二:完整代码示例 (C++版和Java版)

C++11方法一:Time:O(m+n),Space:O(m)

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) 
    {
        vector<int> ret;
        map<int, int> counter;
        for (int num : nums1)
        {
            int count = counter[num];
            counter[num] = count+1;
        }

        for (int num : nums2)
        {
            int count = counter[num];
            if (count > 0)
            {
                counter[num] = count - 1;
                ret.push_back(num);
            }
        }

        return ret;
    }
};

Java方法一:Time:O(m+n),Space:O(m+k)

class Solution {
        public int[] intersect(int[] nums1, int[] nums2)
        {
               Map<Integer,Integer> counter=new HashMap<>();
               for(int num:nums1)
               {
                   int count=counter.getOrDefault(num,0);
                   counter.put(num,count+1);
               }
               List<Integer> list=new ArrayList<>();
               for(int num:nums2)
               {
                   int count=counter.getOrDefault(num,0);
                   if(count>0)
                   {
                       list.add(num);
                       counter.put(num,count-1);
                   }
               }
               int[] result=new int[list.size()];
               
               for(int k=0;k<list.size();k++)
               {
                   result[k]=list.get(k);
               }
               
               return result;
        }
    }

C++11方法二:Time:O(m*log(m)+n*log(n)),Space:O(1)

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) 
    {
        vector<int> ret;
        sort(nums1.begin(),nums1.end());
        sort(nums2.begin(),nums2.end());
        int i = 0, j = 0, m = nums1.size(), n = nums2.size();

        while (i < m && j < n)
        {
            if (nums1[i] == nums2[j])
            {
                ret.push_back(nums1[i]);
                i++; j++;
            }
            else if (nums1[i] < nums2[j])
            {
                i++;
            }
            else
            {
                j++;
            }
        }

        return ret;
    }
};

Java方法二:Time:O(m*log(m)+n*log(n)),Space:O(k)

class Solution {
        public int[] intersect(int[] nums1, int[] nums2) 
        {
               Arrays.sort(nums1);
               Arrays.sort(nums2);
               int i=0,j=0,m=nums1.length,n=nums2.length;
               List<Integer> list=new ArrayList<>();
               
               while(i<m && j<n)
               {
                   if(nums1[i]==nums2[j])
                   {
                       list.add(nums1[i]);
                       i++;j++;
                   }
                   else if(nums1[i]<nums2[j])
                   {
                       i++;
                   }
                   else
                   {
                       j++;
                   }
               }
               
               int[] result=new int[list.size()];
               for(int k=0;k<list.size();k++)
               {
                   result[k]=list.get(k);
               }
               return result;
        }
    }

 

posted @ 2020-04-02 21:28  repinkply  阅读(141)  评论(0)    收藏  举报