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.
可見,並不怎麼減時間,按理來說應該減時間的,看運氣吧…