- 首先想到的解法是借用计数排序的思想,借助计数数组,拿到交集。
代码如下:
public int[] intersect(int[] nums1, int[] nums2) {
// 交集,所以结果数组的长度肯定没最小长度大
int length = Math.min(nums1.length, nums2.length);
int[] result = new int[length];
// 计数排序思路,先获取最大最小值
int max = 0;
int min = Integer.MAX_VALUE;
for (int num : nums1) {
max = Math.max(max, num);
min = Math.min(min, num);
}
// 构建计数数组
int[] count = new int[max - min + 1];
// 把其中一个数组构建进计数数组中
for (int num : nums1) {
count[num - min]++;
}
int len = length;
// 循环另一个数组
for (int num : nums2) {
// 都超限了,肯定没有交集
if (num >= min && num <= max) {
if (count[num - min] > 0) {
// 要是对应计数数组位置有值,取一个出来放入到结果集中
result[--len] = num;
count[num - min]--;
}
}
}
// 结果集极有可能是超长度的了,也就是前面有几个0需要干掉
int[] res = new int[length - len];
System.arraycopy(result, len, res, 0, length - len);
return res;
}
- 对两个数组排序,然后创建两个数组的指针,然后对比两个值,如果相等,放入结果集。
public int[] intersect(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);
int i = 0, j = 0, index = 0;
int[] result = new int[Math.min(nums1.length, nums2.length)];
while (i < nums1.length && j < nums2.length) {
if (nums1[i] == nums2[j]) {
result[index++] = nums1[i++];
j++;
} else if (nums1[i] < nums2[j]) {
i++;
} else if (nums1[i] > nums2[j]) {
j++;
}
}
return Arrays.copyOf(result, index);
}
官方解法1是用的哈希表,而且用长度较小的数组进行构建。
官方解法2思路差不多。