[分离双指针]力扣 349. 两个数组的交集 350. 两个数组的交集 II
给定两个数组 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
题解
不考虑顺序,所以先排序,然后使用p1遍历nums1,p2遍历nums2,vector res记录结果,同时遍历,并进行下面的判断:
1.nums1[p1]<nums2[p2]
:当前p1
指向的元素小,所以p1++
,向右移动寻找更大的元素;
2.nums1[p1]>nums2[p2]
:p2
向右移动;
3.nums1[p1]==nums2[p2]
:res
记录当前相等的值,因为结果不能重复,需要去重,p1
和p2
都要跳过重复的部分,如:1(p1指向),1,1,2=>1,1,1,2(p1指向)
代码
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
int p1=0,p2=0;
int len1=nums1.size();
int len2=nums2.size();
//排序
sort(nums1.begin(),nums1.begin()+len1);
sort(nums2.begin(),nums2.begin()+len2);
vector<int> res;
//开始同时遍历
while(p1<len1&&p2<len2){
if(nums1[p1]<nums2[p2]){
p1++;
}
else if(nums1[p1]>nums2[p2]){
p2++;
}else{
//res记录当前相交的值
res.push_back(nums1[p1]);
//跳过重复的部分,1(p1),1,1,2
while(p1+1<len1&&nums1[p1]==nums1[p1+1]){
p1++;
}
//跳过后1,1,1(p1),2,所以p1还要再走一步
p1++;
//p2同上
while(p2+1<len2&&nums2[p2]==nums2[p2+1]){
p2++;
}
p2++;
}
}
return res;
}
};
给你两个整数数组 nums1
和 nums2
,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]
提示:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000
题解
此题比上题更简单,太简单所以有点难读懂,题意就是两个数组nums1
和 nums2
,要求返回在两个数组都出现过的元素,
并且元素可以重复,所以[1,2,2,1],[2,2]返回了[2,2]因为2在两个数组都出现了两次,
再举个例子[1,1,3,5],[1,1,3,4],返回[1,1,3];
所以与上题不同的是去掉了去重的部分;
不考虑顺序,所以先排序,然后使用p1遍历nums1,p2遍历nums2,vector res记录结果,同时遍历,并进行下面的判断:
1.nums1[p1]<nums2[p2]
:当前p1
指向的元素小,所以p1++
,向右移动寻找更大的元素;
2.nums1[p1]>nums2[p2]
:p2
向右移动;
3.nums1[p1]==nums2[p2]
:res
记录当前相等的值,因为结果可以重复,所以p1
和p2
仅++
,如:1(p1指向),1,1,2=>1,1(p1指向),1,2
代码
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
int p1=0,p2=0;
int len1=nums1.size();
int len2=nums2.size();
sort(nums1.begin(),nums1.begin()+len1);
sort(nums2.begin(),nums2.begin()+len2);
vector<int> res;
while(p1<len1&&p2<len2){
if(nums1[p1]<nums2[p2]){
p1++;
}
else if(nums1[p1]>nums2[p2]){
p2++;
}else{
res.push_back(nums1[p1]);
p1++,p2++;
}
}
return res;
}
};