lintcode 547两数组的交 lintcode 548两数组的交II

本文解析了两数组交集算法的两种情况:一种不允许输出重复元素,另一种允许输出重复元素。介绍了通过排序和移动下标的方法来找到交集,并提供了具体的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1   问题描述

     547 两数组的交

        返回两数组的交

       样例:

      nums1 = [1, 2, 2, 1], nums2 = [2, 2], 返回 [2]

  548 两数组的交II

     计算两个数组的交

      样例

     nums1 = [1, 2, 2, 1], nums2 = [2, 2], 返回 [2, 2].

2 解题思路

 这俩题的解题思路一样,只是一个不可以输出重复元素,另一个能输出重复元素,共同的一步就是先将两个数组排序,然后

在547两数组的交中通过分别移动数组的下标来判断是否有相同的元素,若有则插入到新数组中去,否则不插,最重要的一点就是

新数组的元素不允许有重复,可以通过设置一个记录最新插入的值的标志,每次要插入时判断新数组里面是否已经有相等的元素

若无相等则插入,否则不插入。548两数组的交II新数组中允许有相同的元素。在547的基础上删一些代码就可以实现。

3 解题代码

两数组的交:

      class Solution {
public:
    /**
     * @param nums1 an integer array
     * @param nums2 an integer array
     * @return an integer array
     */
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        // Write your code here
    vector<int> A;
    sort(nums1.begin(),nums1.end());
    sort(nums2.begin(),nums2.end());
    int t;
    int i=0;
    int j=0;
    int n=nums1.size();
    int m=nums2.size();
    while(i<n&&j<m)
    {
      if(nums1[i]==nums2[j])
      {
      if(t!=nums1[i])
      A.push_back(nums1[i]);
      t=nums1[i];
      i++;j++;
      }
    else if(i<n&&j<m&&nums1[i]<nums2[j])
    {
        i++;
    }
    else if(i<n&&j<m&&nums1[i]>nums2[j])
    {
        j++;
    }
    }
     return A;
    }
};

两数组的交II:

   class Solution {
public:
    /**
     * @param nums1 an integer array
     * @param nums2 an integer array
     * @return an integer array
     */
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        // Write your code here
    vector<int> A;
    sort(nums1.begin(),nums1.end());
    sort(nums2.begin(),nums2.end());
 
    int i=0;
    int j=0;
    int n=nums1.size();
    int m=nums2.size();
    while(i<n&&j<m)
    {
      if(nums1[i]==nums2[j])
      {
   
      A.push_back(nums1[i]);
   
      i++;j++;
      }
    else if(i<n&&j<m&&nums1[i]<nums2[j])
    {
        i++;
    }
    else if(i<n&&j<m&&nums1[i]>nums2[j])
    {
        j++;
    }
    }
     return A;
    }
};

4 解题思路

  这个题需要在自己静下来慢慢想,只要先将两数组的交写出来,两数组的交II只是在前面的基础上删掉几行代码就行,

自己刚开始写两个数组的交的时候用了两个for循环,但是一直出的是空结果,这个其实和链表里面合并两个排序链表有相似之处,

链表里面是将指针指向后移,在数组里面将数组元素的下表后移,改完了之后出的就是重复的元素,问了问同学,设置了一个

标志,就解决了问题,II就是在一的基础上允许可以重复元素。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值