两个数组的交集II
问题描述
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
示例
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]
方法一
解题思路
使用map
代码实现
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
if (nums1.length > nums2.length) {
//通过返回函数本身 + 相反的传参确保num1.length <= num2.length
return intersect(nums2,nums1);
}
//将num1放入map中
Map<Integer, Integer> map = new HashMap<>();
for (int num1 : nums1) {
//若num1存在返回num1的value否则返回默认值0
int count = map.getOrDefault(num1,0);
count++;
map.put(num1, count);
}
//遍历num2若当前元素在map中将该元素加入结果数组中
int[] res = new int[nums1.length];
int index = 0;
for (int num2 : nums2) {
int count = map.getOrDefault(num2,0);
if (count > 0) {
//num2在map中
res[index++] = num2;
//map中num2对应的value值减1
count--;
if (count > 0) {
map.put(num2, count);
} else {
//当value值降为0时移除num2
map.remove(num2);
}
}
}
return Arrays.copyOfRange(res,0,index);
}
}
复杂度
设nums1长度为n, nums2长度为m
时间复杂度:
O(n + m)
空间复杂度:
O(n + m)
方法二
解题思路
双指针
代码实现
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
//对数组进行排序
Arrays.sort(nums1);
Arrays.sort(nums2);
int p1 = 0, p2 = 0, p = 0;
int[] res = new int [Math.min(nums1.length, nums2.length)];
while (p1 < nums1.length && p2 < nums2.length) {
if (nums1[p1] < nums2[p2]) {
//当p1指向的元素大于p2时移动p2
p1++;
} else if (nums1[p1] > nums2[p2]) {
//p2指向的元素大于p1时移动p1,
p2++;
} else {
//将当前元素存入res同时移动p1、p2
res[p++] = nums1[p1];
p1++;
p2++;
}
}
return Arrays.copyOfRange(res, 0, p);
}
}
复杂度
设nums1长度为n, nums2长度为m
时间复杂度
O(nlogn + mlogm)
空间复杂度
O(n + m)
ys.copyOfRange(res, 0, p);
}
}
## 复杂度
设nums1长度为n, nums2长度为m
时间复杂度
O(nlogn + mlogm)
空间复杂度
O(n + m)