题目要求
给定两个数组,编写一个函数来计算它们的交集。
题目示例
输入:nums1 = [1,2,2,1], nums2 = [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) {
ArrayList<Integer> arrays = new ArrayList<Integer>();
ArrayList<Integer> tmp2 = new ArrayList<Integer>();
for(int i=0;i<nums2.length;i++){
tmp2.add(nums2[i]);
}
for(int i=0;i<nums1.length;i++){
for(int j=0;j<tmp2.size();j++){
if(nums1[i] == tmp2.get(j)){
arrays.add(nums1[i]);
tmp2.remove(j);
break;
}
}
}
int[] result = new int[arrays.size()];
for(int k=0;k<arrays.size();k++){
result[k] = arrays.get(k).intValue();
}
return result;
}
}
官方题解
采用HashMap的方法,记录元素以及元素出现的个数
首先以较小的数组(节约空间)开辟HashMap;然后用较大的数组与HashMap比较,如果映射值大于0,则加入到结果数组中并将映射值减1;如果映射值等于0,则移除。
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
if(nums1.length > nums2.length) return intersect(nums2, nums1);
Map<Integer, Integer> map = new HashMap<>();
for(int num:nums1){
map.put(num, map.getOrDefault(num, 0) + 1);
}
int[] result = new int[nums1.length];
int index = 0;
for(int num:nums2){
int count = map.getOrDefault(num, 0);
if(count > 0){
result[index++] = num;
count--;
if(count>0){
map.put(num, count);
}else{
map.remove(num);
}
}
}
return Arrays.copyOf(result, index);
}
}
采用排序方法,首先对两个数组进行排序
然后双指针进行比较,不相等则移动,相等则加入到结果数组中。
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);
int length1 = nums1.length, length2 = nums2.length;
int[] result = 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 {
result[index] = nums1[index1];
index1++;
index2++;
index++;
}
}
return Arrays.copyOf(result, index);
}
}