兩個數組的交集
力扣題目鏈接
我的解法:利用數組下標。
缺點:當取值范圍很大時,浪費空間。
class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {int count1[1001]={0};int count2[1001]={0};for(int i=0;i<nums1.size();i++){count1[nums1[i]]++;}for(int i=0;i<nums2.size();i++){count2[nums2[i]]++;}int count =0;for(int i =0;i<1001;i++){if(count1[i]&&count2[i]){count++;}}vector<int> ret;ret.resize(count);int count3=0;for(int i =0;i<1001;i++){if(count1[i]&&count2[i]){ret[count3]= i;count3++;}}return ret;}
};
這道題目,主要要學會使用一種哈希數據結構:unordered_set,這個數據結構可以解決很多類似的問題。
注意題目特意說明:輸出結果中的每個元素一定是唯一的,也就是說輸出的結果的去重的, 同時可以不考慮輸出結果的順序
這道題用暴力的解法時間復雜度是O(n^2),那來看看使用哈希法進一步優化。
那么用數組來做哈希表也是不錯的選擇,例如242. 有效的字母異位詞(opens new window)
但是要注意,使用數組來做哈希的題目,是因為題目都限制了數值的大小。
如果哈希值比較少、特別分散、跨度非常大,使用數組就造成空間的極大浪費。
此時就要使用另一種結構體了,set ,關于set,C++ 給提供了如下三種可用的數據結構:
- std::set
- std::multiset
- std::unordered_set
std::set和std::multiset底層實現都是紅黑樹,std::unordered_set的底層實現是哈希表, 使用unordered_set 讀寫效率是最高的,并不需要對數據進行排序,而且還不要讓數據重復,所以選擇unordered_set。
class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {unordered_set<int> result_set; // 存放結果,之所以用set是為了給結果集去重unordered_set<int> nums_set(nums1.begin(), nums1.end());//將nums1的值插入哈希表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());}
};