「每日LeetCode」2020年10月28日

本文最后更新于:2023年3月19日 晚上

Lt1207. 独一无二的出现次数、hash、排序、数组

1207. 独一无二的出现次数

给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。
如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false
示例 1:

1
2
3
输入:arr = [1,2,2,1,1,3]
输出:true
解释:在该数组中,1 出现了 3 次,2 出现了 2 次,3 只出现了 1 次。没有两个数的出现次数相同。

示例 2:

1
2
输入:arr = [1,2]
输出:false

示例 3:

1
2
输入:arr = [-3,0,1,-3,1,1,1,-3,10,0]
输出:true

提示:

  • 1 <= arr.length <= 1000
  • -1000 <= arr[i] <= 1000

思路

hash+数组去重

很显然很暴力的一种解法,使用哈希记录元素出现个数,转为数组,再去重比较前后数组长度是否发生变化

hash+排序

排序后计算每一个元素出现的数量,判断对应数字在哈希表中是否已有,已有即可返回 false

解答

hash+数组去重

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* @param {number[]} arr
* @return {boolean}
*/
var uniqueOccurrences = function (arr) {
const map = new Map();
for (const num of arr) {
map.set(num, map.has(num) ? map.get(num) + 1 : 1);
}
return (
[...map.values()].length === [...new Set(map.values()).values()].length
);
};

排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* @param {number[]} arr
* @return {boolean}
*/
var uniqueOccurrences = function (arr) {
arr.sort((a, b) => Number(a) - Number(b));
const map = {};
for (let i = 0; i <= arr.length - 1; i++) {
let num = 0;
while (i <= arr.length - 1 && arr[i + 1] === arr[i]) {
i++;
num++;
}
if (map[num]) return false;
map[num] = true;
}
return true;
};