leetcode349_两个数组的交集


一、题目

   

 二、题目分析

    这个让我想起来之前有一道题目的算法分析,就是对于两个数组分别排序,然后使用不同的指针,如果不相等则不断从前向后移动,则可以一次遍历就解决了问题,但是可能排序是需要一定的时间的,但是总体来说时间复杂度还是O(m+n)的。

代码如下:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        sort(nums1.begin(), nums1.end());
        sort(nums2.begin(), nums2.end());
        int length1 = nums1.size();
        int length2 = nums2.size();
        vector<int> final_num;
        //遍历查找
        int search1=0;
        int search2=0;
        while(search1length2){
            if(search1 !=0 ){
                if(nums1[search1] == nums1[search1-1]) {
                    search1++;
                    continue;
                }
            }
            if(search2 !=0 ){
                if(nums2[search2] == nums2[search2-1]) {
                    search2++;
                    continue;
                }
            }
            if(nums1[search1] == nums2[search2]){
                final_num.push_back(nums1[search1]);
                search1++;
                search2++;
            }
            else if(nums1[search1] > nums2[search2]){
                search2++;
            }
            else{
                search1++;
            }
            //std::cout<<"result: "<
        }
        return final_num;
    }
};

  三、参考代码

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> result_set; // 存放结果
        unordered_set<int> nums_set(nums1.begin(), nums1.end());
        for (int num : nums2) {
            // 发现nums2的元素 在nums_set里又出现过
            if (nums_set.find(num) != nums_set.end()) {
                result_set.insert(num);
            }
        }
        return vector<int>(result_set.begin(), result_set.end());
    }
};

  使用了哈希set,主要可以去重,然后实现快速查找,也是很好的思路,主要使用的类型是unoerdered_set