LeetCode【#349】Intersection of Two Arrays

题目链接:

点击跳转

 

题目:

Given two arrays, write a function to compute their intersection.

Example 1:

Input: nums1 = [1,2,2,1], nums2 = [2,2]
Output: [2]

Example 2:

Input: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
Output: [9,4]

Note:

  • Each element in the result must be unique.
  • The result can be in any order.


题目分析:

给两个数组,要求我们求出两个数组的交集。注意点:交集元素不能重复,交集的顺序可以任意。

 

预备知识:

这里要使用到vector,所以具体可以参考我的另一篇博客:C++的vector用法

 

解题思路:

先将两个数组排序,直接利用sort进行升序排序即可。然后给两个指针i ,j 分别指向两个数组,因为都是升序排序,所以此时可以直接比较 nums1[i] 和 nums2[j]。三种情况:

如果是 nums1[i] < nums2[j] ,那么说明 nums1[i] 的数太小,因此 ++i ;

如果是nums1[i] > nums2[j] ,那么说明 nums2[j] 的数太小,因此 ++j ;

如果是 nums1[i] == nums2[j] ,那么此时这个就是相等的,也就是交集,但是有一个问题,就是这个相等的值,是不是已经保存过了,如果保存过了,那么这个值不能保存,因此要求交集中的元素是不能重复的。

那么解决方法,我考虑了两种:

第一种:就是在选择 i ,j 指向的两个数组,如果有重复部分,应该指向最后一个来进行比较 nums1[i] 和 nums2[j]。比如 1 1 2 2 和2 2,那么第一次判断的时候,本来 i=0, 但是因为 i=0 和 i=1相等,所以处理一下,应该用 i=1 的对应值来进行比较。

第二种:在 nums1[i] == nums2[j] 成立时,考虑存进去的交集数组,如果是空的那么存,如果不是空的且交集数组最后一位和nums1[i] 不相等,则可以存;如果是相等的,说明存进去会重复,所以不能存。

 

AC代码:

第一种:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        vector<int> res;
        sort(nums1.begin(),nums1.end());
        sort(nums2.begin(),nums2.end());
        int len1 = nums1.size();
        int len2 = nums2.size();
        int i = 0, j = 0;
        while(i<len1 && j<len2){
            while(i<len1-1 && nums1[i]==nums1[i+1]){  // 要i的范围条件在前面,因为如果nums1[i]==nums1[i+1]条件放在前面的话,会导致数组溢出
                i++;
            }
            while(j<len2-1 && nums2[j]==nums2[j+1]){
                j++;
            }
            
            if(nums1[i] < nums2[j])
                i++;
            else if((nums1[i] > nums2[j]))
                j++;
            else if(nums1[i] == nums2[j]){
                res.push_back(nums1[i]);
                i++;
                j++;
            }
            
        }
        return res;
        
    }
};

 

第二种:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        vector<int> res;
        int i = 0, j = 0;
        sort(nums1.begin(), nums1.end());
        sort(nums2.begin(), nums2.end());
        while (i < nums1.size() && j < nums2.size()) {
            if (nums1[i] < nums2[j]) ++i;
            else if (nums1[i] > nums2[j]) ++j;
            else {
                if (res.empty() || res.back() != nums1[i]) {
                    res.push_back(nums1[i]);
                }
                ++i; ++j;
            }
        }
        return res;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值