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

算法题 在长度 2N 的数组中找出重复 N 次的元素

在长度 2N 的数组中找出重复 N 次的元素

问题描述

给定一个整数数组nums,其长度为2N。数组中恰好有一个元素重复了N次,其余N个元素都是唯一的。请返回重复了N次的元素。

约束条件

  • 2 <= nums.length <= 10000
  • nums.length是偶数
  • 0 <= nums[i] < 10000
  • 数组中恰好有一个元素重复了N

示例

输入: [1,2,3,3] 输出: 3 解释: 数组长度为4 (2N=4, N=2),元素3重复了2次。 输入: [2,1,2,5,3,2] 输出: 2 解释: 数组长度为6 (2N=6, N=3),元素2重复了3次。 输入: [5,1,5,2,5,3,5,4] 输出: 5 解释: 数组长度为8 (2N=8, N=4),元素5重复了4次。

算法思路

方法一:哈希表计数

使用哈希表统计每个元素的出现次数,找到出现次数为N的元素。

方法二:数学

由于数组长度为2N,有一个元素出现N次,其余N个元素各出现 1 次。重复元素占据了数组的一半。

代码实现

方法一:哈希表计数

importjava.util.*;classSolution{/** * 使用哈希表统计元素频次,找到重复N次的元素 * * @param nums 长度为2N的整数数组 * @return 重复了N次的元素 */publicintrepeatedNTimes(int[]nums){Map<Integer,Integer>count=newHashMap<>();intn=nums.length/2;// 重复次数for(intnum:nums){count.put(num,count.getOrDefault(num,0)+1);// 一旦发现某个元素出现次数达到n,立即返回if(count.get(num)==n){returnnum;}}return-1;}}

方法二:间隔

classSolution{/** * 重复元素间隔不超过2 * * @param nums 长度为2N的整数数组 * @return 重复了N次的元素 */publicintrepeatedNTimes(int[]nums){// 检查所有间隔为1的相邻元素对for(inti=0;i<nums.length-1;i++){if(nums[i]==nums[i+1]){returnnums[i];}}// 检查所有间隔为2的元素对for(inti=0;i<nums.length-2;i++){if(nums[i]==nums[i+2]){returnnums[i];}}// 检查所有间隔为3的元素对(只在小数组中需要)for(inti=0;i<nums.length-3;i++){if(nums[i]==nums[i+3]){returnnums[i];}}// 对于长度为4的特殊情况,检查首尾元素returnnums[0];}}

算法分析

方法一:哈希表计数

  • 时间复杂度:O(N)
    • 最坏情况下需要遍历整个数组
    • 平均情况下可能提前找到答案
  • 空间复杂度:O(N)
    • 哈希表最多存储 N+1 个不同元素

方法二:间隔

  • 时间复杂度:O(N)
    • 只需要三次线性扫描
  • 空间复杂度:O(1)
    • 只使用常数额外空间

算法过程

输入[5,1,5,2,5,3,5,4](N=4):

方法一:

  1. 统计频次:5→1, 1→1, 5→2, 2→1, 5→3, 3→1, 5→4
  2. 当 5 的计数达到 4 时,立即返回 5

方法二:

  1. 检查相邻元素:5≠1, 1≠5, 5≠2, 2≠5, 5≠3, 3≠5, 5≠4 → 无匹配
  2. 检查间隔为2的元素:5==5(索引0和2)→ 返回 5

测试用例

publicclassTestRepeatedNTimes{publicstaticvoidmain(String[]args){Solutionsolution=newSolution();// 测试用例1:基本示例int[]nums1={1,2,3,3};System.out.println("Test 1: "+solution.repeatedNTimes(nums1));// 3// 测试用例2:N=3的情况int[]nums2={2,1,2,5,3,2};System.out.println("Test 2: "+solution.repeatedNTimes(nums2));// 2// 测试用例3:N=4的情况int[]nums3={5,1,5,2,5,3,5,4};System.out.println("Test 3: "+solution.repeatedNTimes(nums3));// 5// 测试用例4:相邻重复int[]nums4={1,1,2,3};System.out.println("Test 4: "+solution.repeatedNTimes(nums4));// 1// 测试用例5:间隔为2的重复int[]nums5={1,2,1,3};System.out.println("Test 5: "+solution.repeatedNTimes(nums5));// 1// 测试用例6:最大规模int[]nums6=newint[10000];for(inti=0;i<5000;i++){nums6[i]=9999;// 重复5000次}for(inti=5000;i<10000;i++){nums6[i]=i-5000;// 其他唯一元素}System.out.println("Test 6: "+solution.repeatedNTimes(nums6));// 9999}}

关键点

  1. 问题

    • 重复元素占数组一半
  2. 间隔

    • 重复元素无法完全均匀分散
    • 必然存在两个重复元素的距离不超过 2

常见问题

  1. 为什么方法二中只需要检查间隔1、2、3?
    • 通过鸽巢原理可以证明,在 2N 长度的数组中放置 N 个相同元素,必然存在两个相同元素的距离 ≤ 3。
    • 对于 N≥3,距离 ≤ 2 就足够了。
http://www.cnnetsun.cn/news/721549.html

相关文章:

  • 代驾系统源码 + 同城代驾平台开发:企业级一站式解决方案解析
  • Paraformer-large用户权限控制:不同角色访问限制实现
  • 2026年AI图像生成趋势:开源人像卡通化模型实战入门必看
  • 互联网医院如何通过企业服务盈利?
  • 为什么企业照着 ITIL 做流程,IT 却依然忙乱低效?
  • unet人像卡通化保姆级教程:从零开始部署AI绘画工具
  • 华为市场管理全面拆解#02:佳肴科技的战略十字路口
  • 【专辑】AI大模型应用开发入门-拥抱Hugging Face与Transformers生态 - 使用datasets库加载Huggingface数据集
  • 4款免费低代码工具推荐:中小企业数字化转型的零成本解决方案
  • 从初级测试工程师进阶中级测试岗,一篇避开弯路...
  • 基于SpringBoot+Vue的夕阳红公寓管理系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】
  • 【开题答辩过程】以《基于springboot的影迷推影社交平台》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
  • 从线程池到全局限流:并发失控的根因分析
  • 网易企业邮箱珠海服务商:这5个关键优势你必须知道!
  • 大厂Java岗面试复盘实录!
  • SpringBoot+Vue 夕阳红公寓管理系统平台完整项目源码+SQL脚本+接口文档【Java Web毕设】
  • 企业级在线家具商城设计与实现管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • SpringBoot+Vue 欢迪迈手机商城设计与开发平台完整项目源码+SQL脚本+接口文档【Java Web毕设】
  • 父亲那一眼,看得人心都碎了!《我的朋友安德烈》后劲太大
  • 微算法科技(NASDAQ :MLGO)开发基于QML的入侵检测识别系统(QML-IDS),强化网络安全防护
  • 解决 npm ERR! code EINTEGRITY 报错的 3 种方法(亲测有效)
  • 速卖通买家号如何一键批量注册?完整流程与实操方法详解
  • 霍尼韦尔模块8C-PDOD51
  • 金属款气象仪:支持数据实时读取
  • 网络安全入门书籍推荐:适合大学生和转行人群的 5 本书
  • Nodejs 安装零基础教程 2025,不推荐更改全局安装包位置和配置环境变量
  • 医药企业如何用日志分析工具抓住盗取数据黑手
  • CJ188设备数据 转 SNMP项目案例
  • Pytest自动化测试实战之执行参数
  • [特殊字符]_高并发场景下的框架选择:从性能数据看技术决策[20260120165318]