/**
 * Given an array of integers arr,
 * return true if the number of occurrences of each value in the array is unique or false otherwise.
 *
 *
 *
 * 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
 * @see <a href="https://leetcode.com/problems/unique-number-of-occurrences/">LeetCode</a>
 */
fun uniqueOccurrences(arr: IntArray): Boolean {
    val mapOfNumbers = mutableMapOf<Int, Int>()
    arr.forEach { number ->
        mapOfNumbers[number] = 1 + mapOfNumbers.getOrDefault(number, 0)
    }
    val setOfFrequencies = mutableSetOf<Int>()
    mapOfNumbers.values.forEach { frequency ->
        if (!setOfFrequencies.add(frequency)) {
            return false
        }
    }
    return true
}

/**
 * Given an array of integers arr,
 * return true if the number of occurrences of each value in the array is unique or false otherwise.
 *
 *
 *
 * 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
 * @see <a href="https://leetcode.com/problems/unique-number-of-occurrences/">LeetCode</a>
 */
fun uniqueOccurrences(arr: IntArray): Boolean {
    val mapOfNumbers = mutableMapOf<Int, Int>()
    arr.forEach { number ->
        mapOfNumbers[number] = 1 + mapOfNumbers.getOrDefault(number, 0)
    }
    val setOfFrequencies = mutableSetOf<Int>()
    mapOfNumbers.values.forEach { frequency ->
        if (!setOfFrequencies.add(frequency)) {
            return false
        }
    }
    return true
}
