C++每日一练11-独一无二的出现次数

独一无二的出现次数
给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。

如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/unique-number-of-occurrences/在这里插入图片描述
整体思路:
哈希表(unordered_map)+容器(vector)
(1)遍历arr,把元素和元素出现次数加入哈希表(unordered_map)中
(2)遍历unordered_map,把元素次数放到容器(vector)中
(3)调用sort函数排序
(4)遍历排序后的容器(vector),判断相邻位置是否相同
代码:

class Solution {
public:
    bool uniqueOccurrences(vector<int>& arr) {
        unordered_map<int, int> figure_hash;
        for (int &i : arr) {//遍历,并插入
            figure_hash[i]++;
        }
        vector<int> figure_vec;
        for (auto& p : figure_hash) {
            figure_vec.emplace_back(p.second);
        }
        sort(figure_vec.begin(), figure_vec.end());//排序
        for (int n = 0; n < figure_vec.size()-1; n++) {
            if (figure_vec[n] == figure_vec[n + 1]) return false;
        }
        return true;
    }
};

官方解法:

unordered_map+unordered_set
就是在插入unordered_map后,遍历unordered_map将unordered_map的value值放入unordered_set中,因为unordered_set不能存放相同的key,所以最后判断unordered_set的大小是否等于unordered_map的大小即可,效率比我的高很多
代码:

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();
    }
};

复杂度分析

时间复杂度:O(N)

空间复杂度:O(N)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值