牛客题解 | 数组中重复的数字

news/2025/2/28 14:37:48/文章来源:https://www.cnblogs.com/wc529065/p/18743203

题目

题目链接

题目的主要信息:
  • 一个长度为\(n\)的数组中只有0到\(n-1\)的数字
  • 需要找出其中任意一个重复出现的数字
举一反三:

学习完本题的思路你可以解决如下题目:

JZ56. 数组中只出现一次的两个数字

JZ50. 第一个只出现一次的字符

JZ75. 字符流中第一个不重复的字符

方法一:位置重排(推荐使用)

思路:

既然数组长度为\(n\)只包含了0到\(n-1\)的数字,那么如果数字没有重复,这些数字排序后将会与其下标一一对应。那我们就可以考虑遍历数组,每次检查数字与下标是不是一致的,一致的说明它在属于它的位置上,不一致我们就将其交换到该数字作为下标的位置上,如果交换过程中,那个位置已经出现了等于它下标的数字,那肯定就重复了。

具体做法:

  • step 1:遍历数组,遇到数组元素与下标相同的不用管。
  • step 2:遇到数组元素与下标不同,就将其交换到属于它的位置,交换前检查那个位置是否有相同的元素,若有则重复。
  • step 3:遍历结束完全交换也没重复,则返回-1.

图示:

alt

Java实现代码:

import java.util.*;
public class Solution {//交换函数private void swap(int[] numbers, int a, int b){int temp = numbers[a];numbers[a] = numbers[b];numbers[b] = temp;}public int duplicate (int[] numbers) {for(int i = 0; i < numbers.length; i++){//该位置本来就是对的if(numbers[i] == i)continue;//位置不对,需要换到自己对应的位置else{//对应位置相等,重复if(numbers[i] == numbers[numbers[i]])return numbers[i];//交换位置else{swap(numbers, i, numbers[i]);i--;}}}//没有重复return -1;}
}

C++实现代码:

class Solution {
public:int duplicate(vector<int>& numbers) {for(int i = 0; i < numbers.size(); i++){//该位置本来就是对的if(numbers[i] == i)continue;//位置不对,需要换到自己对应的位置else{//对应位置相等,重复if(numbers[i] == numbers[numbers[i]])return numbers[i];//交换位置else{swap(numbers[i], numbers[numbers[i]]);i--;}}}//没有重复return -1;}
};

Python实现代码:

class Solution:#交换函数def swap(self, numbers: List[int], a: int, b: int):temp = numbers[a]numbers[a] = numbers[b]numbers[b] = tempdef duplicate(self , numbers: List[int]) -> int:for i in range(len(numbers)):#该位置本来就是对的if numbers[i] == i:continue#位置不对,需要换到自己对应的位置else:#对应位置相等,重复if numbers[i] == numbers[numbers[i]]:return numbers[i]#交换位置else:self.swap(numbers, i, numbers[i])i -= 1#没有重复return -1

复杂度分析:

  • 时间复杂度:\(O(n)\),其中\(n\)为数组长度,遍历一次数组,所有的交换都是\(O(1)\)
  • 空间复杂度:\(O(1)\),常数级变量,无额外辅助空间
方法二:哈希表(扩展思路)

知识点:哈希表

哈希表是一种根据关键码(key)直接访问值(value)的一种数据结构。而这种直接访问意味着只要知道key就能在\(O(1)\)时间内得到value,因此哈希表常用来统计频率、快速检验某个元素是否出现过等。

思路:

既然是找重复的问题,那我们利用哈希表记录频率也是一样可以的。只要遇到的元素在哈希表中出现过,它就重复了。

具体做法:

  • step 1:遍历数组,将没有出现过的元素加入哈希表。
  • step 2:遇到的元素在哈希表中出现过就是重复数组。
  • step 3:遍历结束也没找到就返回-1.

Java实现代码:

import java.util.*;
public class Solution {public int duplicate (int[] numbers) {//哈希表记录重复HashMap<Integer, Integer> mp = new HashMap<>();//遍历数组for(int i = 0; i < numbers.length; i++){//如果没有出现过就加入哈希表if(!mp.containsKey(numbers[i]))mp.put(numbers[i], 1);//否则就是重复数字elsereturn numbers[i];}//没有重复return -1;}
}

C++实现代码:

class Solution {
public:int duplicate(vector<int>& numbers) {//哈希表记录重复unordered_map<int, int> mp;//遍历数组for(int i = 0; i < numbers.size(); i++){//如果没有出现过就加入哈希表if(mp.find(numbers[i]) == mp.end())mp[numbers[i]]++;//否则就是重复数字elsereturn numbers[i];}//没有重复return -1;}
};

Python实现代码:

class Solution:def duplicate(self , numbers: List[int]) -> int:#哈希表记录重复mp = dict()#遍历数组for num in numbers:#如果没有出现过就加入哈希表if num not in mp:mp[num] = 1#否则就是重复数字else:return num#没有重复return -1

复杂度分析:

  • 时间复杂度:\(O(n)\),其中\(n\)为数组长度,遍历一次数组,哈希表每次操作都是\(O(1)\)
  • 空间复杂度:\(O(n)\),哈希表最大的空间为数组长度

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客题解 | 数据流中的中位数

牛客题库题解题目 题目链接 题目主要信息:寻找数据的中位数 数据量在不断输入增长举一反三: 学习完本题的思路你可以解决如下题目: BM46. 最小的k个数 方法一:插入排序法(推荐使用) 知识点:插入排序 插入排序是排序中的一种方式,一旦一个无序数组开始排序,它前面部分就…

牛客题解 | 数组中出现次数超过一半的数字

牛客题库题解题目 题目链接 题目主要信息:题目给出一个长度为n的数组,其中有一个数字出现次数超过了数组长度的一半,需要我们找出这个数字 输入数组非空,保证有解,这样就不用考虑特殊情况举一反三: 学习完本题的思路你可以解决如下题目: BM52. 数组中只出现一次的两个数字…

牛客题解 | 数值的整数次方

牛客题库题解题目 题目链接 题目的主要信息:求一个浮点数的整数次方 整数有正有负 不可以使用库函数,也不需要判断大数问题举一反三: 学习完本题的思路你可以解决如下题目: JZ83. 剪绳子(进阶版) 方法一:直接运算(推荐使用) 思路: 既然是求次方,那我们做不断累乘就可…

支付宝 IoT 设备入门宝典(下)设备经营篇

本篇会以支付宝 IoT 设备经营为中心,介绍常见的设备相关能力和问题解决方案,帮助商户利用设备进行运营动作,让设备更好的帮助自己上篇介绍了支付宝 IoT 设备管理,但除了这些基础功能外,商户还可以利用设备进行一些运营动作,让设备更好的帮助自己,本篇就会以设备经营为中…

国家能源集团某煤矿办公网与工业网整合运维

北京智和信通智和网管平台通过跨网络的整合监控运维能力,对某煤矿中的办公网和工业网进行管理。在一个平台内根据网络类型进行区分管理,统一监控。 国家能源集团某煤矿是国家能源集团在晋陕蒙区域的典型现代化井工煤矿,具有丰富的煤炭资源和先进的生产管理模式。 项目…

最长公共子序列LCS 笔记

最长公共子序列LCS 笔记 假设存在两个相同长度平凡的序列,我们希望找到它们最长的公共子序列,在没有其他特殊条件的情况下,利用动态规划计算的时间复杂度为 \(O(n^2)\) ,并且可以记录这个子序列 考虑两个指针作用于两个序列上,记 \(dp_{i,j}\) 表示为连续子序列 \([a_1,a_…

Windows 系统调用学习笔记

依然是 x86 的,照着 lzyddf 师傅的 blog 和 OneTrainee师傅的blog 学的 Windows API Application Programming Interface,简称 API 函数。Windows API 是微软为 Windows 操作系统提供的一组函数、数据结构、常量和协议,允许开发者与操作系统进行交互。通过 Windows API,开发…

作业一:自我介绍+软工五问

作业一这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023/homework/13325这个作业的目标 学习使用github和博客园自我介绍、兴趣爱好 我叫梁鑫…

deepseek---官方API接入

最近deepseek又开放充值了,而且还大降价,果断接入: 1、首先就是去充值,然后获取key 2、打开接口文档-找到合适自己的语言接口 3、直接复制代码就能运行<?php$curl = curl_init();curl_setopt_array($curl, array(CURLOPT_URL => https://api.deepseek.com/chat/comp…

香港服务器选择指南:高防 vs 站群 vs GPU场景解析

一、引言 背景:香港作为亚太地区数据中心枢纽,凭借国际带宽、网络自由、法律完善等优势,成为企业全球化布局的首选节点。 目标:解析香港服务器在不同业务场景下的选择逻辑,帮助企业根据需求匹配高防、站群或GPU服务器。 二、香港服务器的核心优势 | 网络自由性:| 国际带…

大模型常见文件格式safetensors vs. gguf

safetensorsHeader: 文件的元数据(大小、版本) Meta data: 列表,每个元素表示文件里存的张量的类型、形状、偏移量 Tensor data: 列表元素对应的张量数据ggufgguf不依赖外部的配置文件,它可以把配置文件、词表、tokenizer、template等存入gguf中(如果一个模型有多个gguf文…

2025年最值得入手的CRM系统!这5款真的好用不踩坑

挑CRM真让人头大!有的太复杂,上手难 有的功能太少,啥都干不了 有的收费离谱,小团队根本用不起别担心!今天就给大家盘点5款2025年最值得入手的CRM系统,每一款都是真实用户口碑不错的,不管你是创业小团队,还是大公司,这里面肯定有一款适合你。 ​​ 一、简道云CRM 如果你…