概述
LeetCode刷题-1207.独一无二的出现次数
补Leetcode 10月28号的每日一题
一、题目描述:
给你一个整数数组 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
二、Java代码
第一步都是要先计算每个数出现的次数。后面的只需要判断这个出现次数的数组中元素是否有重复的即可。
方法一 :利用数组存储每个数出现的次数
分析:
根据提示-1000 <= arr[i] <= 1000
,我们可以用桶的思想,构建2001个桶(长度为2001的数组),然后遍历给出的数组,每出现一个数,就往对应的桶里扔一个旗子,这样就可以统计数组中每个数的出现次数。 然后我们排除没有旗子的桶,将每个桶里的旗子数量Set集合里放,因为Set集合里的元素不能重复,如果有存放失败的就说明前面存过这个元素了,即每个数的出现次数存在相同的,就返回false。
ps:哈哈哈,画的好丑,手动狗头
注意:数组的下标只能从零开始,而-1000 <= arr[i] <= 1000
,所以counts[1000 + arr[i]]++
,这里加1000处理。
上代码:
class Solution {
public boolean uniqueOccurrences(int[] arr) {
int[] counts = new int[2001];
for(int i=0;i<arr.length;i++){
counts[1000 + arr[i]]++;
}
Set<Integer> set = new HashSet<>();
for(int val : counts){
if(val != 0){
if(!set.add(val)){
return false;
}
}
}
return true;
}
}
提交结果
这。。。内存消耗,12%。。。emmm~。
方法二: 利用HashMap存储每个数出现的次数:
来自题解区:
getOrDefault(Object key, V defaultValue),意思就是当Map集合中有这个key时,就使用这个key对应的value值,如果没有就使用默认值defaultValue
找到每个数出现的次数之后,把出现次数的数组放到集合set中,如果有重复的就会不会存进set,那么set的大小肯定和出现次数的数组长度不一样。否则如果没有重复的,他们的长度肯定是一样的。
class Solution {
public boolean uniqueOccurrences(int[] arr) {
//Map<值,出现的次数>
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < arr.length; i++) {
map.put(arr[i], map.getOrDefault(arr[i], 0) + 1);
}
return map.size() == new HashSet<>(map.values()).size();
}
}
提交结果
最后
以上就是清脆鞋垫为你收集整理的LeetCode刷题-1207.独一无二的出现次数LeetCode刷题-1207.独一无二的出现次数的全部内容,希望文章能够帮你解决LeetCode刷题-1207.独一无二的出现次数LeetCode刷题-1207.独一无二的出现次数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复