[分离双指针]力扣 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记录当前相等的值,因为结果不能重复,需要去重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;
    }
};

 

给你两个整数数组 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;
    }
};
posted @ 2022-05-29 11:38  付玬熙  阅读(33)  评论(0编辑  收藏  举报