1. 程式人生 > >兩個數組的交集 II---簡單

兩個數組的交集 II---簡單

就是 image emp 一個數 inter tin 次數 clas bsp

題目:

  給定兩個數組,編寫一個函數來計算它們的交集。

示例:

  輸入: nums1 = [1,2,2,1] nums2 = [2,2]

  輸出: [2,2]

思路:

  比較淺顯的O(n^2)的做法就是用一個bool數組保存著nums2的元素是否可以被取。暫時沒有什麽更簡便的想法。

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        int length1=nums1.size();
        
int length2=nums2.size(); vector<bool> if_taken{length2}; vector<int> result; for(int i=0;i<length1;i++) { for(int j=0;j<length2;j++) { if(nums1[i]==nums2[j]) { if(!if_taken[j]) { result.push_back(nums2[j]); if_taken[j]
=true; continue; } } } } return result; } };

  結果就是數據量大了,內存不夠了呢。

技術分享圖片

  讓我們來看看更簡便的解法吧:

  有一種方法是使用哈希表,先保存第一個數組元素出現的次數,再在nums2中遍歷,時間復雜度為O(n)。

class Solution {
public:
    vector<int> intersect(vector<int
>& nums1, vector<int>& nums2) { if (nums1.empty()) return {}; if (nums2.empty()) return {}; vector<int> result; map<int,int> nums; for (auto i = nums1.cbegin(); i < nums1.cend(); ++i) { ++nums[*i]; } for (int i = 0; i < nums2.size(); ++i) { if (nums[nums2[i]]) { result.push_back(nums2[i]); --nums[nums2[i]] ; } } return result; } };

  第二種方法先排序,然後使用雙指針,看起來復雜度為O(n^2)呢。不過卻是最快的,應該還要更詳細的數學分析。

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        vector<int> result;
        std::sort(nums1.begin(), nums1.end());
        std::sort(nums2.begin(), nums2.end());
        int index = 0;
        for (int i = 0; i < nums1.size(); ++i) {
            for (int j = index; j < nums2.size(); ++j) {
                if (nums1[i] == nums2[j]) {
                    result.push_back(nums1[i]);
                    index = j + 1;
                    break;
                }
                if (nums1[i] < nums2[j]) {
                    break;
                }
            }
        }
        return result;
    }
};

兩個數組的交集 II---簡單