当前位置: 首页 > news >正文

LeetCode算法题(Go语言实现)_21

题目

给你一个整数数组 arr,如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。

一、代码实现

func uniqueOccurrences(arr []int) bool {
    freq := make(map[int]int)
    // 统计每个数字的出现次数
    for _, num := range arr {
        freq[num]++
    }
    // 检查频率是否唯一
    seen := make(map[int]bool)
    for _, count := range freq {
        if seen[count] {
            return false
        }
        seen[count] = true
    }
    return true
}

二、算法分析

  1. 核心思路

    • 哈希表统计:使用哈希表记录每个元素的出现次数
    • 集合去重:通过集合检查频率是否唯一
    • 双重验证:先统计词频,再验证词频唯一性
  2. 关键步骤

    • 频率统计:遍历数组,用哈希表记录每个数字出现次数(时间复杂度 O(n))
    • 唯一性验证:将哈希表的值存入集合,通过集合自动去重特性判断是否有重复频率(时间复杂度 O(m),m 为不同数字数量)
    • 极值判断:发现重复频率时立即返回 false,否则遍历完成后返回 true
  3. 复杂度

    指标说明
    时间复杂度O(n)两次线性遍历(n 为数组长度)
    空间复杂度O(n)存储哈希表和集合

三、图解示例

在这里插入图片描述

四、边界条件与扩展

  1. 特殊场景处理

    • 全唯一元素[1,2,3] → 所有频率为1,返回 false
    • 单个元素[5] → 频率为1,返回 true
    • 超大数值范围:哈希表自动处理离散分布
  2. 多语言实现

# Python实现(集合去重)
def uniqueOccurrences(arr):
    from collections import Counter
    freq = Counter(arr)
    return len(freq.values()) == len(set(freq.values()))
// Java实现(两次哈希验证)
public boolean uniqueOccurrences(int[] arr) {
    Map<Integer, Integer> freq = new HashMap<>();
    for (int num : arr) freq.put(num, freq.getOrDefault(num, 0) + 1);
    Set<Integer> set = new HashSet<>(freq.values());
    return set.size() == freq.size();
}
  1. 算法对比
方法时间复杂度空间复杂度优势
哈希表+集合法O(n)O(n)最优解,代码简洁
排序+遍历法O(n log n)O(1)无需额外空间
双重循环法O(n²)O(1)仅适用于极小数据量

五、总结与扩展

  • 数学本质:集合论中的单射关系验证(频率集合与原集合大小相等)
  • 工程优化:利用哈希表与集合的 O(1) 查询特性实现高效判断
  • 扩展应用
    1. 词频分析:验证文本中单词出现次数的唯一性
    2. 数据校验:检测日志中事件发生次数的唯一性
    3. 流式处理:结合布隆过滤器处理大规模数据流

相关文章:

  • 《C++知识点之拷贝构造函数》
  • Linux系统安装MySQL 8.0完整指南(新手友好版)
  • 小智机器人关键函数解析:MqttProtocol::SendAudio()对输入的音频数据进行加密处理,通过UDP发送加密后的音频数据
  • spring boot前后端开发上传文件时报413(Request Entity Too Large)错误的可能原因及解决方案
  • 统计局数据分析网站基于Spring Boot SSM原创
  • 各种环境下安装软件的命令对比与总结
  • 算法导论(动态规划)——简单多状态
  • Docker学习--容器操作相关命令--docker wait 命令
  • k8s EmptyDir(空目录)详解
  • C#测试Excel开源组件ExcelDataReader
  • 为什么可视化大屏越来越多应用3D元素呢?
  • Android 11.0 framework中增加开启和关闭飞行模式的接口
  • 使用Redis实现轻量级消息队列
  • C++位运算精要:高效解题的利器
  • Elasticsearch笔记
  • 一个极简的词法分析器实现
  • OpenCV 图形API(6)将一个矩阵(或图像)与一个标量值相加的函数addC()
  • Pycharm(十一):字符串练习题
  • PHP 开发API接口签名验证
  • 翻译: 人工智能如何让世界变得更美好二
  • 想做一个自己的网站怎么做的/seo专业知识培训
  • 移动端网站开发注意些什么/推广平台排行榜
  • 做肮脏交义的网站/数据分析培训
  • 宣传册设计一般多少钱/德州seo整站优化
  • 花生壳域名做网站/长春网站优化哪家好
  • 新网站建设总结/长沙网站制作关键词推广