題目
自己已經走到了怎麼求每個數字的出現次數,但是對判斷出現次數是否有重複沒有好的思路,自己想到的思路就是兩重for迴圈或者先排序再一重for迴圈,但是感覺這兩種都不夠好。
於是看了卡哥的講解,卡哥是用雜湊表來判斷是否有重複的,此處雜湊表用陣列來實現,陣列下標是某個數字的出現次數,陣列值是bool型別,相當於建立了一個從出現次數到該出現次數是否出現的對映(true表示出現了,false表示沒出現)
相當於這題用了兩次雜湊,第一次是從數字到出現次數的對映,第二次是從出現次數到該出現次數是否出現的對映。
結合卡哥的思路寫下如下程式碼:
class Solution {
public:
bool uniqueOccurrences(vector<int>& arr) {
int cnt[2010] = {};
for (auto c : arr)
++cnt[c + 1000];
bool fre[1010] = {};
for (auto e : cnt)
{
if (e)
{
if (fre[e] == false)
fre[e] = true;
else
return false;
}
}
return true;
}
};
這個裡面還有一個關鍵點就是題目規定裡面有一個條件:-1000 <= arr[i] <= 1000
,負數是不能做陣列下標的,所以要加上一個偏移量。此時可以定義一個2001大小的陣列,例如int count[2010];
,統計的時候,將arr[i]
統一加1000,這樣就可以統計arr[i]
的出現頻率了。
看了一下官方題解,思路是差不多的,但是程式碼值得學習。
官方思路:
官方程式碼:
class Solution {
public:
bool uniqueOccurrences(vector<int>& arr) {
unordered_map<int, int> occur;
for (const auto& x: arr) {
occur[x]++;
}
unordered_set<int> times;
for (const auto& x: occur) {
times.insert(x.second);
}
return times.size() == occur.size();
}
};
這個程式碼寫法很好的利用了unordered_set
的特性。
想要了解一下map、unordered_map、set 和 unordered_set的話可以看看這篇部落格 map、unordered_map、set 和 unordered_set的小介紹