给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
说明:
输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。
方法一:
- 排序
- 双指针遍历两个数组,把相等的元素放入到res数组中。
- 相等则判断res的前面一个是否与待添加的元素相等,相等则不添加,否则添加,因为是有序的,所以相等的元素一定排列在一起,这样就能筛选掉它们。
代码:
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
// 排序 双指针 添加到res[]中 确保后一个不等于前一个添加进入res即可
// 1 2 3 3 4 4 2 2 3 3 4 5 6 -> 2 3 4 得到的res也一定是有序的
Arrays.sort(nums1);
Arrays.sort(nums2);
int nums1Length = nums1.length, nums2Length = nums2.length;
int res[] = new int[nums1Length];
int i = 0, j = 0, idx = 0;
while (i < nums1Length && j < nums2Length) {
if (nums1[i] == nums2[j]) {
if (idx == 0 || nums2[j] != res[idx - 1]) {
res[idx++] = nums2[j];
}
i++;
j++;
} else if (nums1[i] < nums2[j]) {
i++;
} else {
j++;
}
}
return Arrays.copyOfRange(res, 0, idx);
}
}
时间复杂度:O(nlgn)
空间复杂度:O(m) 交集的数量