两个数组的交集。题目即是题意,例子,
Example 1:
Input: nums1 = [1,2,2,1], nums2 = [2,2] Output: [2]Example 2:
Input: nums1 = [4,9,5], nums2 = [9,4,9,8,4] Output: [9,4]
这道题有三种写法,1. 两个hashset;2. 双指针;3. 二分法。
首先是两个hashset的思路。用第一个hashset记录num1中的所有元素,然后遍历num2,看num2中每个元素是否在第一个hashset里面出现过,若出现过,则加入第二个hashset,最后用数组返回hashset所有的key。
时间O(n)
空间O(n)
Java实现
1 class Solution {
2 public int[] intersection(int[] nums1, int[] nums2) {
3 // corner case
4 if (nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) {
5 return new int[] {};
6 }
7
8 // normal case
9 HashSet<Integer> set1 = new HashSet<>();
10 HashSet<Integer> set2 = new HashSet<>();
11 for (Integer num : nums1) {
12 set1.add(num);
13 }
14 for (Integer num : nums2) {
15 if (set1.contains(num)) {
16 set2.add(num);
17 }
18 }
19 int i = 0;
20 int[] res = new int[set2.size()];
21 for (Integer element : set2) {
22 res[i++] = element;
23 }
24 return res;
25 }
26 }
JavaScript实现
1 /**
2 * @param {number[]} nums1
3 * @param {number[]} nums2
4 * @return {number[]}
5 */
6 var intersection = function(nums1, nums2) {
7 let set = new Set(nums1);
8 let res = new Set();
9 for (let i = 0; i < nums2.length; i++) {
10 if (set.has(nums2[i])) {
11 res.add(nums2[i]);
12 }
13 }
14 return Array.from(res);
15 };
再来是双指针的思路。也是需要用到一个hashset,因为要求输出unique的结果集。首先sort两个数组,接着用双指针分别遍历两个数组,看是否能找到一样的元素,加入hashset,最后返回的也是hashset的所有的key。
时间O(nlogn) - 因为有sort
空间O(n)
Java实现
1 class Solution {
2 public int[] intersection(int[] nums1, int[] nums2) {
3 Set<Integer> set = new HashSet<>();
4 Arrays.sort(nums1);
5 Arrays.sort(nums2);
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 set.add(nums1[i]);
15 i++;
16 j++;
17 }
18 }
19 int[] result = new int[set.size()];
20 int k = 0;
21 for (Integer num : set) {
22 result[k++] = num;
23 }
24 return result;
25 }
26 }
最后是二分法。先sort num2,对于num1中的每个元素,用二分法去查找是否存在于num2。
时间O(nlogn) - sort
空间O(n)
Java实现
1 class Solution {
2 public int[] intersection(int[] nums1, int[] nums2) {
3 Set<Integer> set = new HashSet<>();
4 Arrays.sort(nums2);
5 for (int num : nums1) {
6 if (helper(nums2, num)) {
7 set.add(num);
8 }
9 }
10 int i = 0;
11 int[] res = new int[set.size()];
12 for (int num : set) {
13 res[i++] = num;
14 }
15 return res;
16 }
17
18 private boolean helper(int[] nums, int target) {
19 int low = 0;
20 int high = nums.length - 1;
21 while (low <= high) {
22 int mid = low + (high - low) / 2;
23 if (nums[mid] == target) {
24 return true;
25 }
26 if (nums[mid] > target) {
27 high = mid - 1;
28 } else {
29 low = mid + 1;
30 }
31 }
32 return false;
33 }
34 }
来源:https://www.cnblogs.com/aaronliu1991/p/12596378.html