给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2,2]
示例 2:
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [4,9]
说明:
代码实现(一):
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
Map<Integer, Integer> map = new HashMap<>();
for(int i : nums1){
if(map.containsKey(i))
map.put(i, map.get(i) + 1);
else
map.put(i, 1);
}
int k = 0;
for(int n : nums2){
if(map.containsKey(n) && map.get(n) > 0){
nums1[k++] = n;
map.put(n, map.get(n) - 1);
}
}
return Arrays.copyOfRange(nums1, 0, k);
}
}
利用 Map 的 getOrDefault() 方法,可以简化代码。
Map 的 getOrDefault(key, defaultValue) 方法:
举个例子:
Map<Integer, Integer> map = new HashMap<>();
map.put(1, 11);
// 存在 1 这个键,返回其对应的值 11
System.out.println(map.getOrDefault(1, 22)); // 11
// 不存在 3 这个键,返回默认值 33
System.out.println(map.getOrDefault(3, 33)); // 33
// 需要注意的是:
// 只要存在这个 key,就返回它对应的值,即使这个值为 null;不存在这个 key 时,才返回默认值。
map.put(4, null);
// 这里打印的是 null,而不是 22
System.out.println(map.getOrDefault(4, 22));
简化代码如下:
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
Map<Integer, Integer> map = new HashMap<>();
for(int i : nums1){
int count = map.getOrDefault(i, 0);
map.put(i, count + 1);
}
int k = 0;
for(int n : nums2){
int t = map.getOrDefault(n, 0);
if(t > 0){
nums1[k++] = n;
map.put(n, t - 1);
}
}
return Arrays.copyOfRange(nums1, 0, k);
}
}
分别对两个数组进行排序,然后逐个比对两个数组的元素,找到重复元素。
代码如下:
class Solution {
public int[] intersect(int[] nums1, int[] nums2){
Arrays.sort(nums1);
Arrays.sort(nums2);
int i = 0, j = 0, k = 0;
while(i < nums1.length && j < nums2.length){
if(nums1[i] == nums2[j]){
nums1[k] = nums2[j];
i++;
j++;
k++;
}else if(nums1[i] > nums2[j]){
j++;
}else if(nums1[i] < nums2[j]){
i++;
}
}
return Arrays.copyOfRange(nums1, 0, k);
}
}