Lintcode——两数组的交



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 intersection(vector& nums1, vector& nums2) {
        // Write your code here
        vector re;
        int i=0;
        int j=0;
        int pre=-1;
        sort(nums1.begin(),nums1.end());
        sort(nums2.begin(),nums2.end());
        while(i          {
             if(nums1[i]                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.感想

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



你可能感兴趣的:(排序)