[分離雙指標]力扣 349. 兩個陣列的交集 350. 兩個陣列的交集 II
349. 兩個陣列的交集
給定兩個陣列 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
題解
不考慮順序,所以先排序
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; } };
350. 兩個陣列的交集 II
給你兩個整數陣列 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;
}
};