给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的
提示:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/intersection-of-two-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
感谢阿飞的详细解法,传送门多解法解两个数组的交集[Persian Leopard]
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
// return intersectionI(nums1, nums2);
// return intersectionII(nums1, nums2);
return intersectionIII(nums1, nums2);
}
//方法三:先排序nums1,然后遍历nums2,判断nums2中元素是否在nums1中存在
//由于nums1有序,所以可以使用二分查找
//时间复杂度O(MlogM + NlogM),空间复杂度O(logM+N)
private int[] intersectionIII(int[] nums1, int[] nums2) {
if (nums1 == null || nums2 == null) {
return null;
}
Set<Integer> set = new HashSet<>();
Arrays.sort(nums1);
for (int num : nums2) {
if (binarySearch(nums1, num)) {
set.add(num);
}
}
int[] result = new int[set.size()];
int index = 0;
for (int num : set) {
result[index++] = num;
}
return result;
}
private boolean binarySearch(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
return true;
} else if (nums[mid] > target) {
right = mid - 1;
} else if (nums[mid] < target) {
left = mid + 1;
}
}
return false;
}
//方法二:先将nums1和nums2排序,定义指针i和j分别指向nums1和nums2
//遍历数组,遇到nums1[i]==nums2[j]使用set保存
//时间复杂度O(MlogM+NlogN),空间复杂度O(logM+logN)
private int[] intersectionII(int[] nums1, int[] nums2) {
if (nums1 == null || nums2 == null) {
return null;
}
Arrays.sort(nums1);
Arrays.sort(nums2);
int i = 0, j = 0;
int m = nums1.length - 1, n = nums2.length - 1;
Set<Integer> set = new HashSet<>();
while (i <= m && j <= n) {
if (nums1[i] == nums2[j]) {
set.add(nums1[i]);
i++;
j++;
} else if (nums1[i] > nums2[j]) {
j++;
} else if (nums1[i] < nums2[j]) {
i++;
}
}
int[] result = new int[set.size()];
int index = 0;
for (int num : set) {
result[index++] = num;
}
return result;
}
//方法一:定义两个set,遍历nums1和nums2
//时间复杂度O(m+n),空间复杂度O(m+n)
private int[] intersectionI(int[] nums1, int[] nums2) {
if (nums1 == null || nums2 == null) {
return null;
}
Set<Integer> s1 = new HashSet<>();
Set<Integer> s2 = new HashSet<>();
for (int num : nums1) {
s1.add(num);
}
for (int num : nums2) {
if (s1.contains(num)) {
s2.add(num);
}
}
int[] result = new int[s2.size()];
int index = 0;
for (int num : s2) {
result[index++] = num;
}
return result;
}
}