【数据结构和算法】独一无二的出现次数

news2025/1/9 5:48:57

其他系列文章导航

Java基础合集
数据结构与算法合集

设计模式合集

多线程合集

分布式合集

ES合集


文章目录

其他系列文章导航

文章目录

前言

一、题目描述

二、题解

2.1 哈希类算法题注意事项

2.2 方法一:判断长度

2.3 方法二: set 判断

2.4 方法三:使用数组

三、代码

2.2 方法一:判断长度

2.3 方法二: set 判断

2.4 方法三:使用数组

四、复杂度分析

2.2 方法一:判断长度

2.3 方法二: set 判断

2.4 方法三:使用数组


前言

这是力扣的 1207 题,难度为简单,解题方案有很多种,本文讲解我认为最奇妙的一种。


一、题目描述

给你一个整数数组 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

二、题解

2.1 哈希类算法题注意事项

解决哈希类的算法题需要注意以下几点:

  1. 理解哈希表的基本原理:哈希表是一种数据结构,它使用哈希函数将键映射到数组中的位置。理解哈希表如何工作是解决这类问题的关键。
  2. 选择合适的哈希函数:一个好的哈希函数能够将键均匀地分布到哈希表中,以减少冲突。你需要选择或设计一个能够满足题目要求的哈希函数。
  3. 处理冲突:即使有好的哈希函数,也可能会有冲突(即两个不同的键映射到同一个位置)。你需要决定如何处理这些冲突,例如使用链表、开放地址法等。
  4. 考虑哈希表的负载因子:负载因子是哈希表中元素的数量与哈希表大小的比值。当负载因子过高时,哈希表的性能会下降。因此,你可能需要动态调整哈希表的大小以保持合适的负载因子。
  5. 优化空间和时间效率:在解决这类问题时,你需要权衡空间和时间效率。一个空间效率高的解决方案可能不那么高效,反之亦然。你需要找到一个合适的平衡点。
  6. 测试和验证:在提交解决方案之前,一定要进行彻底的测试和验证。确保你的解决方案在各种情况下都能正常工作。
  7. 阅读和理解题目要求:仔细阅读题目,确保你完全理解了题目的要求。如果有任何疑问,应该向老师或教练询问,以确保没有误解。
  8. 使用适当的数据结构:在许多情况下,使用哈希表并不是唯一的解决方案。其他数据结构(如数组、树或图)可能更适合解决特定的问题。选择最适合的数据结构可以提高解决问题的效率。
  9. 注意算法的复杂度:了解算法的时间复杂度和空间复杂度对于选择合适的算法非常重要。对于大规模数据,应选择复杂度较低的算法以提高效率。
  10. 多做练习:解决哈希类的算法题需要大量的练习和经验积累。通过参与在线编程挑战、参加算法竞赛等方式,可以提高解决这类问题的能力。

2.2 方法一:判断长度

思路与算法:

先计算每个数出现的次数。最后只需要判断这个出现次数的数组中元素是否有重复的即可。

我们知道集合 set 是不能有重复元素的,如果有就会替换掉,我们可以把出现次数的数组放到集合 set 中,如果有重复的就会被替换掉,那么 set 的大小肯定和出现次数的数组长度不一样。

否则如果没有重复的,他们的长度肯定是一样的。

2.3 方法二: set 判断

思路与算法:

先计算每个数出现的次数。

在set集合中如果有相同的元素,就会存储失败,返回false,每次存储的时候我们只要判断是否存储成功即可。

2.4 方法三:使用数组

思路与算法:

题中提示中数组的大小和长度都有了限制,所以我们还可以使用数组。

先创建一个 2001 容量的数组,记录每个数的出现次数。

再次进行遍历这个数组,如果元素等于 0 那就继续遍历,不等于 0 的就向 set 数组里存元素,在set集合中如果有相同的元素,就会存储失败,返回false。


三、代码

2.2 方法一:判断长度

Java版本:

class Solution {
    HashMap<Integer, Integer> map = new HashMap<>();
    for (int i : arr) {
        map.put(i, map.getOrDefault(i, 0) + 1);
    }
    return map.size() == new HashSet<>(map.values()).size();
}

C++版本:

class Solution {
public:
    bool uniqueOccurrences(vector<int>& arr) {
        unordered_map<int, int> map;
        for (int i : arr) {
            map[i]++;
        }
        return map.size() == unordered_set<int>(map.begin(), map.end()).size();
    }
};

2.3 方法二: set 判断

Java版本:

class Solution {
    HashMap<Integer, Integer> map = new HashMap<>();
    for (int i : arr) {
        map.put(i, map.getOrDefault(i, 0) + 1);
    }
    HashSet<Integer> set = new HashSet<>();
    for (Integer value : map.values()) {
        if (!set.add(value)) {
            return false;
        }
    }
    return true;
}

C++版本:

class Solution {
public:
    bool uniqueOccurrences(vector<int>& arr) {
        unordered_map<int, int> map;
        for (int i : arr) {
            map[i]++;
        }
        unordered_set<int> set;
        for (auto& pair : map) {
            if (!set.insert(pair.second).second) {
                return false;
            }
        }
        return true;
    }
};

2.4 方法三:使用数组

Java版本:

class Solution {
    public boolean uniqueOccurrences(int[] arr) {
       int[] count = new int[2001];
        for (int i : arr) {
            count[1000 + i]++;
        }
        HashSet<Integer> set = new HashSet<>();
        for (int i : count) {
            if (i == 0) continue;
            if (!set.add(i)) return false;
        }
        return true;
    }
}

C++版本:

class Solution {
public:
    bool uniqueOccurrences(vector<int>& arr) {
        vector<int> count(2001, 0);
        for (int i : arr) {
            count[1000 + i]++;
        }
        unordered_set<int> set;
        for (int i : count) {
            if (i == 0) continue;
            if (set.count(i) > 0) return false;
            set.insert(i);
        }
        return true;
    }
};

四、复杂度分析

2.2 方法一:判断长度

  • 时间复杂度:O(N)。
  • 空间复杂度:O(N)。

2.3 方法二: set 判断

  • 时间复杂度:O(N)。
  • 空间复杂度:O(N)。

2.4 方法三:使用数组

  • 时间复杂度:O(N)。
  • 空间复杂度:O(N)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1341938.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MCEWMDRMNDBootstrap.dll文件丢失,软件游戏无法启动,怎样下载修复

不少小伙伴反馈&#xff0c;在打开某些游戏或软件的时候&#xff0c;Windows会提示“MCEWMDRMNDBootstrap.dll文件丢失&#xff0c;软件无法启动”&#xff0c;不知道应该怎样办&#xff1f; 首先&#xff0c;我们先来了解“MCEWMDRMNDBootstrap.dll文件”是什么&#xff1f; …

Sensor Demosaic IP 手册PG286笔记

《 UG1449 Multimedia User Guide》中包含了大量的多媒体IP简介。 本IP 用于对bayer RGB&#xff08;每个pixel只有单个R/G/B&#xff09;做去马赛克处理&#xff0c;恢复成每个pixel点都有完整的RGB值。通过axi接口配置IP内部erg。 1、算法手册中的描述 提到了几种插值算法&…

友情提示!使用JDK11,如果 maven包含 <scope>test</scope>标签,构建时会出现严重错误

最近在做selenium的升级工作&#xff0c;使用jdk 11.0.20 maven 3.9.6&#xff0c;Pom 配置如下&#xff1a; maven构建报错 <dependencies> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selen…

电脑监控软件是无路径、无进程吗

后台有很多人问&#xff0c;电脑监控软件是无路径、无进程吗。 今天先来回答一下这个问题&#xff0c;电脑监控软件是无路径、无进程&#xff0c;不易被发现的。 一、避免被发现 电脑监控软件可以通过无路径、无进程的方式进行安装和运行&#xff0c;以避免被员工发现和删除…

Java AOP

1 概述 1.1 定义 AOP&#xff08;Aspect Oriented Programming&#xff09;&#xff0c;即面向切面编程 。在不修改原有代码的基础上&#xff0c;对代码进行增强。 1.2 术语 1.3 底层原理 入门案例 项目名&#xff1a;day049_spring_aop 坐标&#xff1a;web、test、aop &…

浅谈安科瑞智能照明系统在马来西亚国家石油公司项目的应用

摘要&#xff1a;随着社会经济的发展及网络技术、通信技术的提高&#xff0c;人们对照明设计提出了新的要求&#xff0c;它不仅要控制照明光源的发光时间、 亮度&#xff0c;而且与其它系统来配合不同的应用场合做出相应的灯光场景。本文介绍了马亚西亚石油公司智能照明项目的应…

磁盘LVM逻辑卷和扩容

一、LVM介绍 1、LVM是Linux中对硬盘分区的一种管理机制。 2、工作原理&#xff1a; ①动态调整磁盘&#xff0c;提高磁盘管理的灵活性 ②/boot分区用于存放引导文件&#xff0c;不能基于LVM创建 ③图形界面管理工具 3、LVM机制的基本概念 ①物理卷&#xff1a;将硬盘转船…

2023年度五大容灾关键词

当前&#xff0c;云计算已成为推动企业数字化转型的关键技术之一。它已逐步渗透进入各个行业&#xff0c;如互联网、政务、金融和制造业&#xff0c;企业上云的比例和应用深度也大幅提升。与此同时&#xff0c;不可抗力因素带来的灾害风险仍然持续&#xff0c;战争、地震、海啸…

Weblogic反序列化远程命令执行(CVE-2019-2725)

漏洞描述&#xff1a; CVE-2019-2725是一个Oracle weblogic反序列化远程命令执行漏洞&#xff0c;这个漏洞依旧是根据weblogic的xmldecoder反序列化漏洞&#xff0c;通过针对Oracle官网历年来的补丁构造payload来绕过。 复现过程&#xff1a; 1.访问ip&#xff1a;port 2.可…

一文浅谈旋转变换:旋转矩阵、旋转向量、欧拉角、四元数

目录 一、旋转矩阵 1.1 定义和推导 1.2 旋转矩阵的缺点 二、旋转向量 2.1 定义和推导 2.1.1 旋转向量转旋转矩阵 2.1.2 旋转矩阵转旋转向量 2.2 旋转向量的缺陷 三、欧拉角 3.1 定义和推导 3.1.1 欧拉角与旋转矩阵 3.1.1.1 欧拉角转旋转矩阵 3.1.1.2 旋转矩阵转欧…

关于“Python”的核心知识点整理大全49

目录 16.2.10 加亮颜色主题 16.3 小结 第&#xff11;7 章 使用API 17.1 使用 Web API 17.1.1 Git 和 GitHub 17.1.2 使用 API 调用请求数据 17.1.3 安装 requests 17.1.4 处理 API 响应 python_repos.py 注意 17.1.5 处理响应字典 python_repos.py import json i…

Python 内置高阶函数练习(Leetcode500.键盘行)

Python 内置高阶函数练习&#xff08;Leetcode500.键盘行&#xff09; 【一】试题 &#xff08;1&#xff09;地址&#xff1a; 500. 键盘行 - 力扣&#xff08;LeetCode&#xff09; &#xff08;2&#xff09;题目 给你一个字符串数组 words &#xff0c;只返回可以使用在…

阿里云数据库polardb怎么收费?

阿里云数据库PolarDB租用价格表&#xff0c;云数据库PolarDB MySQL版2核4GB&#xff08;通用&#xff09;、2个节点、60 GB存储空间55元5天&#xff0c;云数据库 PolarDB 分布式版标准版2核16G&#xff08;通用&#xff09;57.6元3天&#xff0c;阿里云百科aliyunbaike.com分享…

AI数字员工的出现:不是取代,而是让技术更好地服务于人类_光点科技

在人工智能技术迅猛发展的今天&#xff0c;AI数字员工的出现成为了企业和组织关注的热点。与传统观念中的机器人或自动化设备不同&#xff0c;AI数字员工是集成了最新AI技术&#xff0c;如自然语言处理、机器学习和情感分析等功能的虚拟助手&#xff0c;它们能够完成复杂的工作…

.Net FrameWork总结

.Net FrameWork总结 介绍.Net公共语言运行库CLI的组成.NET Framework的主要组成.NET Framework的优点CLR在运行期管理程序的执行&#xff0c;包括以下内容CLR提供的服务FCL的组成 或 服务&#xff08;这个其实就是我们编码时常用到的类库&#xff09;&#xff1a;&#xff08;下…

ERROR: No matching distribution found for torch==2.0.1解决方案

大家好&#xff0c;我是水滴~~ 本文主要介绍在安装 stable-diffusion-webui 时出现的 ERROR: No matching distribution found for torch2.0.1 问题的解决方案&#xff0c;希望能对你有所帮助。 《Python入门核心技术》专栏总目录・点这里 文章目录 问题描述解决方案离线安装 …

WeakMap 和 Map 的区别,WeakMap 原理,为什么能被 GC?

垃圾回收机制 我们知道&#xff0c;程序运行中会有一些垃圾数据不再使用&#xff0c;需要及时释放出去&#xff0c;如果我们没有及时释放&#xff0c;这就是内存泄露 JS 中的垃圾数据都是由垃圾回收&#xff08;Garbage Collection&#xff0c;缩写为 GC&#xff09;器自动回…

MyBatis的基本使用及常见问题

MyBatis 前言MyBatis简介MyBatis快速上手Mapper代理开发增删改查环境准备配置文件完成增删改查查询添加修改删除 参数传递注解完成增删改查 前言 JavaWeb JavaWeb是用Java技术来解决相关Web互联网领域的技术栈。 MySQL数据库与SQL语言 MySQL&#xff1a;开源的中小型数据库。…

【银行测试】金融银行-理财项目面试/分析总结(二)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 银行理财相关的项…

【温故而知新】vue运用之探讨下单页面应用(SPA)与多页面应用(MPA)

一、概念 1.单页面应用SPA(Single page application) Vue单页面应用是一种采用Vue.js框架开发的Web应用程序,它仅有一个HTML文件,通过前端路由实现页面的切换和渲染。与传统的多页面应用相比,Vue单页面应用在用户体验和开发效率方面有着明显的优势。 在Vue单页面应用中…