zoukankan      html  css  js  c++  java
  • [LeetCode] Intersection of Two Arrays 两个数组相交

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

    Example:
    Given nums1 = [1, 2, 2, 1]nums2 = [2, 2], return [2].

    Note:

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

    这道题让我们找两个数组交集的部分(不包含重复数字),难度不算大,我们可以用个set把nums1都放进去,然后遍历nums2的元素,如果在set中存在,说明是交集的部分,加入结果的set中,最后再把结果转为vector的形式即可:

    解法一:

    class Solution {
    public:
        vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
            set<int> s(nums1.begin(), nums1.end()), res;
            for (auto a : nums2) {
                if (s.count(a)) res.insert(a);
            }
            return vector<int>(res.begin(), res.end());
        }
    };

    我们还可以使用两个指针来做,先给两个数组排序,然后用两个指针分别指向两个数组的开头,然后比较两个数组的大小,把小的数字的指针向后移,如果两个指针指的数字相等,那么看结果res是否为空,如果为空或者是最后一个数字和当前数字不等的话,将该数字加入结果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;
        }
    };

    我们还可以使用二分查找法来做,思路是将一个数组排序,然后遍历另一个数组,把遍历到的每个数字在排序号的数组中用二分查找法搜索,如果能找到则放入结果set中,这里我们用到了set的去重复的特性,最后我们将set转为vector即可:

    解法三:

    class Solution {
    public:
        vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
            set<int> res;
            sort(nums2.begin(), nums2.end());
            for (auto a : nums1) {
                if (binarySearch(nums2, a)) {
                    res.insert(a);
                }
            }
            return vector<int>(res.begin(), res.end());
        }
        bool binarySearch(vector<int> &nums, int target) {
            int left = 0, right = nums.size();
            while (left < right) {
                int mid = left + (right - left) / 2;
                if (nums[mid] == target) return true;
                else if (nums[mid] < target) left = mid + 1;
                else right = mid;
            }
            return false;
        }
    };

    或者我们也可以使用STL的set_intersection函数来找出共同元素,很方便:

    解法四:

    class Solution {
    public:
        vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
            set<int> s1(nums1.begin(), nums1.end()), s2(nums2.begin(), nums2.end()), res;
            set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), inserter(res, res.begin()));
            return vector<int>(res.begin(), res.end());
        }
    };

    类似题目:

    Intersection of Two Arrays II

    参考资料:

    https://leetcode.com/discuss/103345/three-java-solutions

    https://leetcode.com/discuss/103224/my-c-solution-with-sort

    https://leetcode.com/discuss/103295/my-c-solutions-using-set-and-unordered_set

    LeetCode All in One 题目讲解汇总(持续更新中...) 

  • 相关阅读:
    hdu 5101 Select
    hdu 5100 Chessboard
    cf B. I.O.U.
    cf C. Inna and Dima
    cf B. Inna and Nine
    cf C. Counting Kangaroos is Fun
    Radar Installation 贪心
    spfa模板
    Sequence
    棋盘问题
  • 原文地址:https://www.cnblogs.com/grandyang/p/5507129.html
Copyright © 2011-2022 走看看