[東哥的leetcode刷題日記] leetcode 349 : Intersection of Two Arrays

leetcode 349 : Intersection of Two Arrays


題目鏈接: https://leetcode.com/problems/intersection-of-two-arrays/
難度: 簡單
歸類 : 數組操作, 二分查找, set,unordered_set

題目:

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

示例:

示例 1:
輸入: nums1 = [1,2,2,1], nums2 = [2,2]
輸出: [2]
示例 2:
輸入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
輸出: [9,4]


解法:

主要使用c++進行了解答,以及經典題解和嘗試改進的最優/最簡潔解法。


個人解法

c++解法(set)

對兩個數組分別進行for循環,分別放入兩個set中,然後遍歷求兩個set共有的值。

#c++解法,假設len1=N.len2=M,則時間複雜度爲O(max(M,N))
class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        int len1 = nums1.size();
        int len2 = nums2.size();
        set<int> set1;
        set<int> set2;
        for(int i = 0; i < len1; i++){
            set1.insert(nums1[i]);
        }
        for(int i = 0; i < len2; i++){
            set2.insert(nums2[i]);
        }
        vector<int> res;
        set<int>::iterator it = set1.begin();
        for(;it!=set1.end();it++){
            if(set2.find(*it) != set2.end()){
                res.push_back(*it);
            }
        }
        return res;
    }
};

時間複雜度: O(N+M)
空間複雜度: O(N+M)
提交結果:
Runtime: 8 ms, faster than 88.53% of C++ online submissions for Intersection of Two Arrays.
Memory Usage: 10.9 MB, less than 6.67% of C++ online submissions for Intersection of Two Arrays.

c++解法(set法的改進 : unordered_set)

unordered_set比set的優點在於,它是基於哈希表,能夠以常數級別的時間存儲和取出數據,但其內存佔用較大。

#unordered_set
class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        
        unordered_set<int> set1(nums1.begin(), nums1.end());
        vector<int> res;
        for(auto a : nums2){
            if(set1.count(a)){
                res.push_back(a);
                set1.erase(a);
            }
        }
        return res;
    }
};

時間複雜度: O(N)
空間複雜度: 未知
提交結果:
Runtime: 8 ms, faster than 88.53% of C++ online submissions for Intersection of Two Arrays.
Memory Usage: 10.8 MB, less than 6.67% of C++ online submissions for Intersection of Two Arrays.


題解優解

c++解法(普通單set)

使用普通的單個set來完成,空間複雜度較低。根據結果可見,空間就降一點,時間漲很多。

vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
    set<int> s(nums1.begin(), nums1.end());
    vector<int> out;
    for (int x : nums2)
        if (s.erase(x))
            out.push_back(x);
    return out;
}

時間複雜度: 未知
空間複雜度: 未知
提交結果:
Runtime: 12 ms, faster than 47.42% of C++ online submissions for Intersection of Two Arrays.
Memory Usage: 10.4 MB, less than 6.67% of C++ online submissions for Intersection of Two Arrays.


嘗試改進的最優解法

在unordered_set解法的基礎上,找到了一個可以將count和erase結合的方法。即在判斷unordered_set中是否存在某元素時,可以使用set1.erase(a)來判斷,同時可以刪去該元素。

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        
        unordered_set<int> set1(nums1.begin(), nums1.end());
        vector<int> res;
        for(auto a : nums2){
            if(set1.erase(a)){
                res.push_back(a);
            }
        }
        return res;
    }
};

時間複雜度: 未知
空間複雜度: 未知
提交結果:
Runtime: 12 ms, faster than 47.42% of C++ online submissions for Intersection of Two Arrays.
Memory Usage: 10.8 MB, less than 6.67% of C++ online submissions for Intersection of Two Arrays.

可見,並不怎麼減時間,按理來說應該減時間的,看運氣吧…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章