当前位置: 首页 > 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.jsqmd.com/news/275950/

相关文章:

  • 为什么Qwen3-1.7B调用失败?LangChain接入避坑指南
  • 有全局感受野的傅里叶卷积块用于MRI重建/文献速递-基于人工智能的医学影像技术
  • Qwen3Guard-Gen-WEB数据隔离:私有化部署实战
  • 算法题 最大宽度坡
  • unet image Face Fusion跨域问题解决?CORS配置正确姿势
  • 江苏硕晟LIMS pro3.0:引领实验室信息管理新高度
  • Java Web mvc高校办公室行政事务管理系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】
  • Qwen3-Embedding-0.6B与text-embedding-ada-002对比评测
  • 用Qwen3-0.6B做的第一个AI项目——新闻分类器上线
  • Z-Image-Turbo支持哪些格式?PNG转换技巧分享
  • SpringBoot+Vue 在线问卷调查系统管理平台源码【适合毕设/课设/学习】Java+MySQL
  • fft npainting lama日志轮转配置:避免磁盘空间耗尽最佳实践
  • Qwen3-1.7B vs Phi-3-mini:端侧部署可行性对比评测
  • Qwen3-1.7B跨境电商应用:多语言商品描述生成
  • 计算机毕业设计springboot大学生兼职信息管理系统 基于SpringBoot的高校学生兼职岗位智能撮合平台 面向校园的兼职资源一站式管理与匹配系统
  • Qwen-Image-2512-ComfyUI文旅宣传应用:景区海报自动生成系统
  • Arbess项目实战 - 基于GitHub实现Java项目构建并自动化Docker部署
  • Python系列Bug修复|如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘catboost’ 问题
  • 计算机毕业设计springboot大学生健康管理系统 基于SpringBoot的高校学生身心健康追踪与干预平台 校园健康云:面向大学生的智能健康档案与风险预警系统
  • GPT-OSS部署成本分析:vGPU资源使用优化建议
  • Python系列Bug修复|如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘lightgbm’ 问题
  • Python系列Bug修复|如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘xgboost’ 问题
  • Python系列Bug修复|如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘cudf’ 问题
  • YOLO11云端部署指南,GPU加速轻松开启
  • Python系列Bug修复|如何解决PyCharm中pip安装requests报错ModuleNotFoundError: No module named ‘requests’问题
  • Speech Seaco Paraformer文件命名乱码?中文路径兼容性解决方案
  • Python系列Bug修复|如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘dask’ 问题
  • 万物识别模型版权保护:水印嵌入与溯源机制部署
  • VibeThinker-1.5B代码生成避坑:常见错误输出及修正方法
  • OpenCV 算子速查手册(覆盖99%的OpenCV开发需求)