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; } }

浙公网安备 33010602011771号