350. 两个数组的交集 II
Yuxuan Wu Lv13

350. 两个数组的交集 II

给定两个数组,编写一个函数来计算它们的交集。

示例 1:

1
2
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]

示例 2:

1
2
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]

说明:

  • 输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。
  • 我们可以不考虑输出结果的顺序。

题解1:集合

注意:

remove 有多个重载方法,有没有 Integer.valueOf 就是 remove(int index) 和 remove(Object obj) 的关系,所以在这里一定要用remove(Integer.valueOf(num))

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package arraylist;

import java.util.ArrayList;

public class Intersect {

/**
* Given two integer arrays nums1 and nums2, return an array of their intersection. Each element in the result must appear as many times as it shows in both arrays and you may return the result in any order.
*
* Example 1:
*
* Input: nums1 = [1,2,2,1], nums2 = [2,2]
* Output: [2,2]
* Example 2:
*
* Input: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
* Output: [4,9]
* Explanation: [9,4] is also accepted.
*
* [4,9,5]
* [9,4,9,8,4]
*
*/
public int[] intersect(int[] nums1, int[] nums2) {
// 1. 用Arraylist 储存nums1值
ArrayList list1 = new ArrayList();
for (int num1 : nums1) {
list1.add(num1);
}

// 2. new 一个新的results array
// 注意这里不能用array,因为扩展不方便,所以还是使用list
ArrayList storeList = new ArrayList();

// 3. 遍历nums2

for (int num2 : nums2) {
// 4. 判断是否在nums2中,若是删除
if (list1.contains(num2)) {
storeList.add(num2);
// list1.remove(num2);
list1.remove(Integer.valueOf(num2));
// remove 有多个重载方法,有没有 Integer.valueOf 就是 remove(int index) 和 remove(Object obj) 的关系
//5. 加入到新的res array中
}

}

// 4. 返还删除后的nums2 作为results,然后去重复,转换为数组
int[] res = new int[storeList.size()];
int counter = 0;
for (Object num : storeList) {
res[counter] = (int) num;
counter++;
}

return res;
}
}

题解2:排序+双指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
    public int[] intersect_two_pointers(int[] nums1, int[] nums2) {
//1. sort序列
Arrays.sort(nums1);
Arrays.sort(nums2);

//2.定义接受list
ArrayList<Integer> temp = new ArrayList<Integer>();


//3. 双指针遍历
int p1 = 0, p2 = 0;
while (p1 < nums1.length && p2 < nums2.length) {
// for (int p1 = 0, p2 = 0; p1 < nums1.length && p2 < nums2.length; p1++, p2++) {
//4.相等则用temp接受
if (nums1[p1] == nums2[p2]) {
temp.add(nums1[p1]);
p1++;
p2++;
}

else if (nums1[p1] < nums2[p2]) {
p1++;

}
else {
p2++;

}

}

//5. 返回array形式
int[] results = new int[temp.size()];
int counter = 0;
for (Integer nums : temp) {
results[counter] = nums;
counter++;
}


return results;
}
  • Post title:350. 两个数组的交集 II
  • Post author:Yuxuan Wu
  • Create time:2021-07-09 23:05:23
  • Post link:yuxuanwu17.github.io2021/07/09/350. 两个数组的交集 II/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.