1. 程式人生 > 其它 >[分離雙指標]力扣 349. 兩個陣列的交集 350. 兩個陣列的交集 II

[分離雙指標]力扣 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

題解

不考慮順序,所以先排序

,然後使用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記錄當前相等的值,因為結果不能重複,需要去重p1p2都要跳過重複的部分,如: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記錄當前相等的值,因為結果可以重複,所以p1p2++,如: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;
    }
};