示例 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
思路:先将数组转成set
,然后遍历长度小的set
,判断set1``中的元素是否存在于``set2
中,存在的话就是其中一个交集。
复杂度:时间复杂度
O
(
m
+
n
)
O(m+n)
O(m+n),m
,n
是两数组的长度,数组转成集合的时间复杂度就是数组的长度,遍历寻找交集的复杂度是
O
(
m
i
n
(
m
,
n
)
)
O(min(m,n))
O(min(m,n))。空间复杂度
O
(
m
+
n
)
O(m+n)
O(m+n),就是两个set
的空间
JAVA
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> set1 = new HashSet<Integer>();
Set<Integer> set2 = new HashSet<Integer>();
for (int num : nums1) {
set1.add(num);
}
for (int num : nums2) {
set2.add(num);
}
return getIntersection(set1, set2);
}
public int[] getIntersection(Set<Integer> set1, Set<Integer> set2) {
if (set1.size() > set2.size()) {
return getIntersection(set2, set1);
}
Set<Integer> intersectionSet = new HashSet<Integer>();
for (int num : set1) {
if (set2.contains(num)) {
intersectionSet.add(num);
}
}
int[] intersection = new int[intersectionSet.size()];
int index = 0;
for (int num : intersectionSet) {
intersection[index++] = num;
}
return intersection;
}
}
思路:数组排序,然后用两个指针分别遍历数组,如果两个指针指向的元素相等 就是其中一个交集,否则比较两个指针指向的元素的大小,较小的向前移动
复杂度:时间复杂度
O
(
m
l
o
g
m
+
n
l
o
g
n
)
O(mlogm+nlogn)
O(mlogm+nlogn),两数组快排时间复杂度分别是
O
(
m
l
o
g
m
)
O(mlogm)
O(mlogm)、
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn),双指针遍历需要
O
(
m
+
n
)
O(m+n)
O(m+n),复杂度取决于较大的
O
(
m
l
o
g
m
+
n
l
o
g
n
)
O(mlogm+nlogn)
O(mlogm+nlogn)。空间复杂度
O
(
l
o
g
m
+
l
o
g
n
)
O(logm+logn)
O(logm+logn)排序使用的额外空间.。
代码
Java
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);
int length1 = nums1.length, length2 = nums2.length;
int[] intersection = new int[length1 + length2];
int index = 0, index1 = 0, index2 = 0;
while (index1 < length1 && index2 < length2) {
int num1 = nums1[index1], num2 = nums2[index2];
if (num1 == num2) {
if (index == 0 || num1 != intersection[index - 1]) {
intersection[index++] = num1;
}
index1++;
index2++;
} else if (num1 < num2) {
index1++;
} else {
index2++;
}
}
return Arrays.copyOfRange(intersection, 0, index);
}
}
c++
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result_set; // 存放结果
unordered_set<int> nums_set(nums1.begin(), nums1.end());
for (int num : nums2) {
// 发现nums2的元素 在nums_set里又出现过
if (nums_set.find(num) != nums_set.end()) {
result_set.insert(num);
}
}
return vector<int>(result_set.begin(), result_set.end());
}
};