难度:⭐
题目描述:
给你一个整数数组 arr
,请你帮忙统计数组中每个数的出现次数。
如果每个数的出现次数都是独一无二的,就返回 true
;否则返回 false
。
示例1:
1 | 输入:arr = [1,2,2,1,1,3] |
示例2:
1 | 输入:arr = [1,2] |
示例3:
1 | 输入:arr = [-3,0,1,-3,1,1,1,-3,10,0] |
提示:
1 <= arr.length <= 1000
-1000 <= arr[i] <= 1000
解题过程:
思路:
使用计数法,定义一个大小为2000的数组tmp,遍历整数数组arr,每个元素i出现的次数传到数组tmp中的下标索引i处。接下来只需要判断数组tmp中是否有重复的元素,遍历数组tmp对每个大于0的元素值和索引存储到map容器中,值作为键,索引作为map的值,利用map容器键相同值覆盖的特性,只要tmp中元素值有相同的,map容器中的元素个数一定会和tmp中大于0的元素个数不相同。
c++代码:(执行用时4ms,击败90.69%,内存消耗8.8M,击败6.72%)
1 | class Solution { |
官方题解:
方法一:哈希表
首先使用哈希表记录每个数字的出现次数;随后再利用新的哈希表,统计不同的出现次数的数目。如果不同的出现次数的数目等于不同数字的数目,则返回 $\textit{true}$,否则返回 $\textit{false}$。
c++代码:(执行用时4ms,击败90.69%,内存消耗8.5M,击败50.19%)
1 | class Solution { |
复杂度分析
时间复杂度:$O(N)$,其中 $N$ 为数组的长度。遍历原始数组需要 $O(N)$时间,而遍历中间过程产生的哈希表又需要 $O(N)$ 的时间。
空间复杂度:$O(N)$。
总结:
官方题解和我的思路一样,不过表达的比我清楚(我也会越来越好的),stl容器用的也比我6(嘘!我会回悄悄地野蛮生长🙂),代码写的比我的简洁。