Algorithms to Determine Unique Number of Occurrences

  • 时间:2020-09-18 17:39:21
  • 分类:网络文摘
  • 阅读:144 次

Given an array of integers arr, write a function that returns true if and only if the number of occurrences of each value in the array is unique.

Example 1:
Input: arr = [1,2,2,1,1,3]
Output: true
Explanation: The value 1 has 3 occurrences, 2 has 2 and 3 has 1. No two values have the same number of occurrences.

Example 2:
Input: arr = [1,2]
Output: false

Example 3:
Input: arr = [-3,0,1,-3,1,1,1,-3,10,0]
Output: true

Constraints:
1 <= arr.length <= 1000
-1000 <= arr[i] <= 1000

Using Hashmap and Hashset

We can use hashmap e.g. the unordered_map in C++ to record the number of occurencies for the numbers. Then we can use a hash set to determine if an occurence has appeared or not – return false immediately once we found at least one occurence is not unique.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
public:
    bool uniqueOccurrences(vector<int>& arr) {
        unordered_map<int, int> data;
        for (const auto &n: arr) {
            data[n] ++;
        }
        unordered_set<int> hash;
        for (auto it = data.begin(); it != data.end(); it ++) {
            if (hash.count(it->second)) {
                return false;
            }
            hash.insert(it->second);
        }
        return true;
    }
};
class Solution {
public:
    bool uniqueOccurrences(vector<int>& arr) {
        unordered_map<int, int> data;
        for (const auto &n: arr) {
            data[n] ++;
        }
        unordered_set<int> hash;
        for (auto it = data.begin(); it != data.end(); it ++) {
            if (hash.count(it->second)) {
                return false;
            }
            hash.insert(it->second);
        }
        return true;
    }
};

Alternatively, we can push all the occurrences values into the set and compare the sizes of both hash map and hash set.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public:
    bool uniqueOccurrences(vector<int>& arr) {
        unordered_map<int, int> data;
        for (const auto &n: arr) {
            data[n] ++;
        }
        unordered_set<int> hash;
        for (auto it = data.begin(); it != data.end(); it ++) {
            hash.insert(it->second);
        }
        return hash.size() == data.size();
    }
};
class Solution {
public:
    bool uniqueOccurrences(vector<int>& arr) {
        unordered_map<int, int> data;
        for (const auto &n: arr) {
            data[n] ++;
        }
        unordered_set<int> hash;
        for (auto it = data.begin(); it != data.end(); it ++) {
            hash.insert(it->second);
        }
        return hash.size() == data.size();
    }
};

Apparently, both algorithms are O(N) time and O(N) space. The first approach may be slightly faster due to early exit while the second implementation looks concise.

–EOF (The Ultimate Computing & Technology Blog) —

推荐阅读:
How to Write Compelling Blog Content for Boring Niches  Why Curvy Blogger Put On A Bikini For The First Time In 25 Years  Blogger Gives His Secret To Becoming A Millionaire By Age 30  One Food Blog Is Proving Just How Successful Food Blogs Can Be  Planning To Update Your Website For 2020? Read This.  Learn to Stay Cool in Online Casinos and Control Emotions  Bash Function to Check Palindrome Strings  Algorithm to Find Duplicate Files in System using Hash Map  C++ Coding Reference: Copy N values by using std::fill_n()  C++ Advanced Topics: 10 Questions 
评论列表
添加评论