Lintcode——两数组的交

本文介绍了一种寻找两个整数数组交集的算法,并详细解释了实现思路与代码。通过排序与双指针技巧,避免了重复元素的加入,确保结果集合的唯一性。

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



1.题目

返回两个数组的交

注意事项

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

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

2.思路

      先对两个数组进行排序,然后从两个数组的头开始遍历并比对,当比对到相同元素时加入到交数组中。

      因为是已经排过序的数组,所以当1数组的i位小于2数组的j位时,可以直接下移比对1数组的i+1位和2数组的j位;2数组j位小于1数组的i位时则2数组下移,比对2数组j+1位和1数组的i位。

     这个问题的难点在于如果相同的数字出现两边则只保存一遍的。所以在把相同元素加入到交数组时,要进行判断是否已加入过该元素,若已经加入过,则不再加入第二遍。

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> re;
        int i=0;
        int j=0;
        int pre=-1;
        sort(nums1.begin(),nums1.end());
        sort(nums2.begin(),nums2.end());
        while(i<nums1.size()&&j<nums2.size())
         {
             if(nums1[i]<nums2[j])
               i++;
             if(nums1[i]>nums2[j])
               j++;
             if(nums1[i]==nums2[j]&&nums1[i]!=pre)
              {
                re.push_back(nums1[i]);
                pre=nums1[i];
                i++;  j++;
              }
              if(nums1[i]==nums2[j]&&nums1[i]==pre)
              { i++;  j++;}
            }
         return re;
        }
    };

4.感想

      这个问题的判断是否已经加入过该元素很有意思。一开始的想法是不管三七二十一先将相同元素加入到交数组中,再遍历交数组删除重复元素,但是觉得那样好像复杂了。。不如直接在加入元素时进行判断:在每次加入时用临时变量保存其值,下次加入时与临时变量进行比较,如果相同则不再重复加入,这样就简单多了,省的再费第二遍事。。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值