1207. 獨一無二的出現次數

hisun9發表於2024-11-18

題目

自己已經走到了怎麼求每個數字的出現次數,但是對判斷出現次數是否有重複沒有好的思路,自己想到的思路就是兩重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]的出現頻率了。

看了一下官方題解,思路是差不多的,但是程式碼值得學習。

官方思路:

img

官方程式碼:

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的小介紹

相關文章