互联网行业的小白,写博客的目的是为了记录自己的学习过程、对自己学习中所犯的错误做一个总结。由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!
题目描述
题目传送门:独一无二的出现次数
给你一个整数数组 arr
,请你帮忙统计数组中每个数的出现次数。
如果每个数的出现次数都是独一无二的,就返回 true
;否则返回 false
。
示例 1:
输入:arr = [1,2,2,1,1,3]
输出:true
解释:在该数组中,1 出现了 3 次,2 出现了 2 次,3 只出现了 1 次。没有两个数的出现次数相同。
示例 2:
输入:arr = [1,2]
输出:false
示例 3:
输入:arr = [-3,0,1,-3,1,1,1,-3,10,0]
输出:true
提示:
1 <= arr.length <= 1000
-1000 <= arr[i] <= 1000
题解
暴力实现 |
建立一个范围为-1000到1000
的数组hash
,遍历arr
,对arr
的元素计数,在遍历一遍hash
,找是否存在相同的两个不为0
的数即可。
AC代码
class Solution:
def uniqueOccurrences(self, arr: List[int]) -> bool:
hash = [0] * 2005
for i in arr:
hash[i] += 1
for i, j in enumerate(hash):
for m, n in enumerate(hash):
if m != i and j == n and n != 0:
return False
return True
用此这种势必会消耗大量的时间
和空间
了
下面采用另外一种方式
排序+集合 |
先排序数组,然后扫描每一个元素的出现次数并加入set
,发现重复次数时返回false
,遍历结束后返回true
。
AC代码
class Solution:
def uniqueOccurrences(self, arr: List[int]) -> bool:
count = [0] * 2005
for i in arr:
count[i] += 1
count.sort(reverse = True)
set1 = set()
for i in count:
if i == 0:
break
else:
if i in set1:
return False
else:
set1.add(i)
return True
你还记得集合的去重功能吗?还可以这样解:
先计算每个数出现的次数,放在数组hash
中,再遍历hash
中的数放入集合set
中,由于集合的去重性,只需判断hash
和set
的长度即可。
AC代码
class Solution:
def uniqueOccurrences(self, arr: List[int]) -> bool:
count = [0] * 2005
for i in arr:
count[i] += 1
cnt = 0 # 记录数组的长度,为0的元素不算在内
set1 = set()
for i in count:
if i == 0:
continue
cnt += 1
set1.add(i)
if cnt == len(set1):
return True
else:
return False
另一种写法:
collections.Counter(arr)是python中的计数函数
,不容易记住,所以不推荐使用啦
class Solution:
def uniqueOccurrences(self, arr: List[int]) -> bool:
collect = collections.Counter(arr)
lst = []
for i in collect.values():
lst.append(i)
if len(lst) == len(set(lst)):
return True
return False
码字不易,您的
支持
就是我坚持
下去的动力,一起加油哦。