题目描述:
给你两个整数数组 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]
方法一:排序+双指针:
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);
int length1 = nums1.length, length2 = nums2.length;
int[] ans = new int[Math.min(length1, length2)];
int index1 = 0, index2 = 0, index = 0;
while (index1 < length1 && index2 < length2) {
if (nums1[index1] < nums2[index2]) {
index1++;
} else if (nums1[index1] > nums2[index2]) {
index2++;
} else {
ans[index++] = nums1[index1];
index1++;
index2++;
}
}
return Arrays.copyOfRange(ans, 0, index);
}
}
方法2.Hash表:
class Solution {
public int[] intersect(int[] num1, int[] num2) {
if(num1.length>num2.length)
{
return intersect(num2,num1);
}
Map<Integer,Integer> map=new HashMap<Integer,Integer>();
for(int num:num1)
{
int count=map.getOrDefault(num,0)+1;
map.put(num,count);
}
int [] ans=new int[num1.length];
int index=0;
for(int num:num2)
{
int count=map.getOrDefault(num,0);
if(count>0)
{
ans[index++]=num;
count--;
if(count>0)
{
map.put(num,count);
}else
{
map.remove(num);
}
}
}
return Arrays.copyOfRange(ans,0,index);
}
}