首页 > 其他分享 >1207. 独一无二的出现次数

1207. 独一无二的出现次数

时间:2024-11-18 19:07:11浏览次数:1  
标签:map arr set 1207 独一无二 次数 出现 unordered

题目

自己已经走到了怎么求每个数字的出现次数,但是对判断出现次数是否有重复没有好的思路,自己想到的思路就是两重for循环或者先排序再一重for循环,但是感觉这两种都不够好。

于是看了卡哥的讲解,卡哥是用哈希表来判断是否有重复的,此处哈希表用数组来实现,数组下标是某个数字的出现次数,数组值是bool类型,相当于创建了一个从出现次数到该出现次数是否出现的映射(true表示出现了,false表示没出现)

相当于这题用了两次哈希,第一次是从数字到出现次数的映射,第二次是从出现次数到该出现次数是否出现的映射。

结合卡哥的思路写下如下代码:

class Solution {
public:
    bool uniqueOccurrences(vector<int>& arr) {
        int cnt[2010] = {};
        for (auto c : arr)
            ++cnt[c + 1000];
        bool fre[1010] = {};
        for (auto e : cnt)
        {
            if (e)
            {
                if (fre[e] == false)
                    fre[e] = true;
                else
                    return false;
            }
        }
        return true;
    }
};

这个里面还有一个关键点就是题目规定里面有一个条件:-1000 <= arr[i] <= 1000,负数是不能做数组下标的,所以要加上一个偏移量。此时可以定义一个2001大小的数组,例如int count[2010];,统计的时候,将arr[i]统一加1000,这样就可以统计arr[i]的出现频率了。

看了一下官方题解,思路是差不多的,但是代码值得学习。

官方思路:

img

官方代码:

class Solution {
public:
    bool uniqueOccurrences(vector<int>& arr) {
        unordered_map<int, int> occur;
        for (const auto& x: arr) {
            occur[x]++;
        }
        unordered_set<int> times;
        for (const auto& x: occur) {
            times.insert(x.second);
        }
        return times.size() == occur.size();
    }
};

这个代码写法很好的利用了unordered_set的特性。

想要了解一下map、unordered_map、set 和 unordered_set的话可以看看这篇博客 map、unordered_map、set 和 unordered_set的小介绍

标签:map,arr,set,1207,独一无二,次数,出现,unordered
From: https://www.cnblogs.com/hisun9/p/18553449

相关文章

  • leetcode1963. 使字符串平衡的最小交换次数
    给你一个字符串 s ,下标从0开始 ,且长度为偶数 n 。字符串 恰好 由 n/2 个开括号 '[' 和 n/2 个闭括号 ']' 组成。只有能满足下述所有条件的字符串才能称为 平衡字符串 :字符串是一个空字符串,或者字符串可以记作 AB ,其中 A 和 B 都是 平衡字符串......
  • (nice!!!)(LeetCode) 3240. 最少翻转次数使二进制矩阵回文 II (分类讨论、数组)
    题目:3240.最少翻转次数使二进制矩阵回文II思路:分类讨论,需要对行和列的个数进行讨论,时间复杂度为0(nm),细节看注释。C++版本:classSolution{public:intminFlips(vector<vector<int>>&grid){intans=0;intn=grid.size(),m=grid[0].size();......
  • Stream流统计集合元素出现次数并降序
    使用Arrays.stream()结合Collectors.groupingBy()和Collectors.counting()来统计数组中每个元素出现个数,按照出现次数降序排列后获取前五个元素及其出现次数的示例代码:importjava.util.*;importjava.util.stream.Collectors;publicclassArrayElementCountTopFive{......
  • LeetCode 3014[输入单词需要的最少按键次数I]
    题目链接LeetCode3014[输入单词需要的最少按键次数I]详情实例实例1实例2提示题解思路一圈下来8个字母,每个字母按1次二圈下来16个字母,前8个字母每个按1次,后8个字母,每个按2次三圈下来24个字母,前8个字母每个按1次,中间8个字母,每个按2次,最后8个字母,每个按3次四圈下来......
  • 前15天查询次数曲线
    publicintgetAuditCount(){intnum=0;try{Exampleexample=newExample(AuditInfo.class);SimpleDateFormatdf=newSimpleDateFormat("yyyy-MM-dd");Datetoday=df.parse(df.format(newDate()));Dateyesterday=df.parse(df.format(newDate(......
  • python统计字符串中单个字符出现次数
    str='skdaskerkjsalkj'list=[]foriinrange(len(str)):list.append(str[i])list2=sorted(list)print(list2)foriinrange(len(list)):flag2=Falsest=list2[i]k=i-1#是不是第一个whilek>=0:if(li......
  • Leetcode每日一题 3226. 使两个整数相等的位更改次数
    Leetcode每日一题##3226.使两个整数相等的位更改次数###C++给你两个正整数n和k。你可以选择n的二进制表示中任意一个值为1的位,并将其改为0。返回使得n等于k所需要的更改次数。如果无法实现,返回-1。解题思路:通过除2取余依次获得两个数对应的二进制位......
  • 华为OD机试-E卷,100分 - 最小的调整次数特异性双端队列Java & Python& JS & C++ & C
    最新华为OD机试题目描述有一个特异性的双端队列,该队列可以从头部或尾部添加数据,但是只能从头部移出数据。小A依次执行2n个指令往队列中添加数据和移出数据。其中n个指令是添加数据(可能从头部添加、也可能从尾部添加),依次添加1到n;n个指令是移出数据。现在要求移除数据的顺......
  • RabbitMQ实现轮询形式消息最大发送失败次数,及详细解析
    RabbitMQ设置消息最大发送失败次数,达到三次后不确认消息(此处根据业务需求可考虑使不确认的消息进入死信交换机)配置文件:spring:rabbitmq:host:192.168.1.248port:5672username:adminpassword:123456virtual-host:powernodepublisher......
  • 动态规划-回文串系列——1312.让字符串变成回文串的最小插入次数
    1.题目解析题目来源:1312.让字符串变成回文串的最小插入次数——力扣测试用例2.算法原理1.状态表示一维dp表无法存储任意区间内将字符串变为回文子串的最小插入次数,所以使用二维dp表存储将[i,j]区间的字符串变为回文子串的最小插入次数dp[i][j]:将[i,j]区间的字......