题目
给定两个数组,编写一个函数来计算它们的交集。
思路
1. 排好序后,双指针
注意点:Arrays.copyOfRange(res, 0, index);,要不然后面有多余的0
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
// 排好序,双指针
// int l1 = 0, l2 = 0;
int len1 = nums1.length, len2 = nums2.length;
int[] res = len1 < len2 ? new int[len1] : new int[len2];
if(nums1 == null || nums2 == null) return res;
Arrays.sort(nums1);
Arrays.sort(nums2);
int l1 = 0, l2 = 0, index = 0;
while(l1 < nums1.length && l2 < nums2.length) {
if(nums1[l1] == nums2[l2]) {
res[index++] = nums1[l1];
l1++;
l2++;
}
else if(nums1[l1] < nums2[l2]) l1++;
else l2++;
}
return Arrays.copyOfRange(res, 0, index);
}
}
2. HashMap
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
// if(nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) return new int[];
int[] res;
res = nums1.length < nums2.length ? help(nums1, nums2) : help(nums2, nums1);
return res;
}
private int[] help(int[] smallArray, int[] bigArray) {
int[] res = new int[smallArray.length];
int index = 0;
Map<Integer, Integer> map = new HashMap<>(smallArray.length);
for(int num : smallArray) {
map.put(num, map.getOrDefault(num, 0) + 1);
}
for(int num : bigArray) {
int number = map.getOrDefault(num, 0);
if(number > 0) {
res[index++] = num;
map.put(num, --number);
}
}
return Arrays.copyOfRange(res, 0, index);
}
}
出错点:
错误:
for(int num : bigArray) {
int number = map.get(num); // 如果map没有num, number会是null
if(number != 0) { // 那么这里会出NonePointerException
res[index++] = num; // 而且也不能是number != 0, 如果number为负数呢?应该明确条件
map.put(num, --number);
}
}
正确:
for(int num : bigArray) {
int number = map.getOrDefault(num, 0);
if(number > 0) {
res[index++] = num;
map.put(num, --number);
}
}
return Arrays.copyOfRange(res, 0, index);