LeetCode 349. Intersection of Two Arrays

原题链接在这里:https://leetcode.com/problems/intersection-of-two-arrays/

题目:

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

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

Note:

    • Each element in the result must be unique.
    • The result can be in any order.

题解:

用一个HashSet 来保存nums1的每个element.

再iterate nums2, 若HashSet contains nums2[i], 把nums2[i]加到res中,并把nums[i]从HashSet中remove掉.

Time Complexity: O(nums1.length + nums2.length). Space: O(nums1.length).

AC Java:

 1 public class Solution {
 2     public int[] intersection(int[] nums1, int[] nums2) {
 3         HashSet<Integer> nums1Hs = new HashSet<Integer>();
 4         for(int num : nums1){
 5             nums1Hs.add(num);
 6         }
 7         
 8         List<Integer> res = new ArrayList<Integer>();
 9         for(int num : nums2){
10             if(nums1Hs.contains(num)){
11                 res.add(num);
12                 nums1Hs.remove(num);
13             }
14         }
15         int [] resArr = new int[res.size()];
16         int i = 0;
17         for(int num : res){
18             resArr[i++] = num;
19         }
20         return resArr;
21     }
22 }

AC C++:

 1 class Solution {
 2 public:
 3     vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
 4         vector<int> res;
 5         unordered_set<int> set(nums1.begin(), nums1.end());
 6         for(int num : nums2){
 7             if(set.erase(num)){
 8                 res.push_back(num);
 9             }
10         }
11 
12         return res;
13     }
14 };

也可以使用两个HashSet.

Time Complexity: O(nums1.length + nums2.length). Space: O(nums1.length).

AC Java:

 1 public class Solution {
 2     public int[] intersection(int[] nums1, int[] nums2) {
 3         HashSet<Integer> nums1Hs = new HashSet<Integer>();
 4         HashSet<Integer> intersectHs = new HashSet<Integer>();
 5         for(int num : nums1){
 6             nums1Hs.add(num);
 7         }
 8         for(int num : nums2){
 9             if(nums1Hs.contains(num)){
10                 intersectHs.add(num);
11             }
12         }
13         
14         int [] res = new int[intersectHs.size()];
15         int i = 0;
16         for(int num : intersectHs){
17             res[i++] = num;
18         }
19         return res;
20     }
21 }

Sort nums1 and nums2, 再用双指针 从头iterate两个sorted array.

Time Complexity: O(nlogn). Space: O(1).

AC Java:

 1 public class Solution {
 2     public int[] intersection(int[] nums1, int[] nums2) {
 3         Arrays.sort(nums1);
 4         Arrays.sort(nums2);
 5         HashSet<Integer> hs = new HashSet<Integer>();
 6         int i = 0;
 7         int j = 0;
 8         while(i<nums1.length && j<nums2.length){
 9             if(nums1[i] < nums2[j]){
10                 i++;
11             }else if(nums1[i] > nums2[j]){
12                 j++;
13             }else{
14                 hs.add(nums1[i]);
15                 i++;
16                 j++;
17             }
18         }
19         
20         int [] resArr = new int[hs.size()];
21         int k = 0;
22         for(int num : hs){
23             resArr[k++] = num; 
24         }
25         return resArr;
26     }
27 }

AC C++:

 1 class Solution {
 2 public:
 3     vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
 4         sort(nums1.begin(), nums1.end());
 5         sort(nums2.begin(), nums2.end());
 6         int len1 = nums1.size();
 7         int len2 = nums2.size();
 8         int i = 0;
 9         int j = 0;
10         vector<int> res;
11 
12         while(i < len1 && j < len2){
13             if(i > 0 && nums1[i] == nums1[i - 1]){
14                 i++;
15                 continue;
16             }
17 
18             if(nums1[i] < nums2[j]){
19                 i++;
20             }else if(nums1[i] > nums2[j]){
21                 j++;
22             }else{
23                 res.push_back(nums1[i]);
24                 i++;
25                 j++;
26             }
27         }
28 
29         return res;
30     }
31 };

sort nums1, 然后nums2 array 每一个element在 sorted 上做binary search.

Time Complexity: O(mlogm + nlogm), m = nums1.length, n = nums2.length.

Space: O(resArr.length).

AC Java:

 1 public class Solution {
 2     public int[] intersection(int[] nums1, int[] nums2) {
 3         HashSet<Integer> res = new HashSet<Integer>();
 4         Arrays.sort(nums1);
 5         for(int num : nums2){
 6             if(binarySearch(nums1, num)){
 7                 res.add(num);
 8             }
 9         }
10         
11         int [] resArr = new int[res.size()];
12         int i = 0;
13         for(int num : res){
14             resArr[i++] = num;
15         }
16         return resArr;
17     }
18     
19     private boolean binarySearch(int [] nums, int target){
20         int low = 0;
21         int high = nums.length-1;
22         while(low <= high){
23             int mid = low + (high-low)/2;
24             if(nums[mid] < target){
25                 low = mid+1;
26             }else if(nums[mid] > target){
27                 high = mid-1;
28             }else{
29                 return true;
30             }
31         }
32         return false;
33     }
34 }

跟上Intersection of Two Arrays IIIntersection of Three Sorted Arrays.

posted @ 2017-01-06 05:45  Dylan_Java_NYC  阅读(368)  评论(0编辑  收藏  举报