题目来源
题目解析
使用set
public static int[] intersection(int[] nums1, int[] nums2) {
HashSet<Integer> set = new HashSet<>();
for (int i : nums1){
set.add(i);
}
HashSet<Integer> child = new HashSet<>();
for (int i : nums2){
if (set.contains(i)){
child.add(i);
}
}
int [] res = new int[child.size()];
int j = 0;
for (Integer i : child){
res[j++] = i;
}
return res;
}
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
std::unordered_set<int> set;
for(auto num : nums1){
set.insert(num);
}
std::unordered_set<int> child;
for(auto num : nums2){
if(set.count(num)){
child.insert(num);
}
}
std::vector<int> vec;
for(auto num : child){
vec.emplace_back(num);
}
return vec;
}
};
使用双指针
先将nums1 与nums2 排序,然后游走两个指针
时间复杂度:O(nlogn)
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);
HashSet<Integer> child = new HashSet<>();
int i = 0;
int j = 0;
while (i < nums1.length && j < nums2.length){
if (nums1[i] == nums2[j]){
child.add(nums1[i]);
i++;
j++;
}else if (nums1[i] > nums2[j]){
j++;
}else{
i++;
}
}
int [] res = new int[child.size()];
int d = 0;
for (Integer num : child){
res[d++] = num;
}
return res;
}
}
class Solution {
public:
// 输出结果中的每个元素一定是 唯一 的
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
std::sort(nums1.begin(), nums1.end());
std::sort(nums2.begin(), nums2.end());
std::unordered_set<int> set;
int i = 0, j = 0;
while (i < nums1.size() && j < nums2.size()){
if(nums1[i] == nums2[j]){
set.insert(nums1[i]);
i++;
j++;
}else if(nums1[i] < nums2[j]){
i++;
}else{
j++;
}
}
std::vector<int> vec;
for(auto i : set){
vec.emplace_back(i);
}
return vec;
}
};