面试题03-数组中重复的数字

本文介绍了一种高效查找数组中重复数字的方法,利用哈希集合快速定位重复元素,实现时间复杂度O(n)和空间复杂度O(n)的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

示例 1:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3

限制:
2 <= n <= 100000

题目分析:

思路一:
     由于只需要找出数组中任意一个重复的数字,因此遍历数组,遇到重复的数字即返回。为了判断一个数字是否重复遇到,使用集合存储已经遇到的数字,如果遇到的一个数字已经在集合中,则当前的数字是重复数字。

1. 初始化集合为空集合,重复的数字 repeat = -1
2. 遍历数组中的每个元素:
	(1) 将该元素加入集合中,判断是否添加成功
	(2) 如果添加失败,说明该元素已经在集合中,因此该元素是重复元素,
	(3) 将该元素的值赋给 repeat,并结束遍历
3. 返回 repeat 即可

复杂性分析

  1. 时间复杂度: O ( n ) O(n) O(n)
    遍历数组一遍。使用哈希集合(HashSet),添加元素的时间复杂度为 O ( 1 ) O(1) O(1),故总的时间复杂度是 O ( n ) O(n) O(n)

  2. 空间复杂度: O ( n ) O(n) O(n)
    不重复的每个元素都可能存入集合,因此占用 O ( n ) O(n) O(n)额外空间。

思路二:
大神解法之原地交换法

Java代码:
import java.util.HashSet;
import java.util.Set;

/**
 * 面试题03. 数组中重复的数字
 * 找出数组中重复的数字。
 * 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。
 * 数组中某些数字是重复的,但不知道有几个数字重复了,
 * 也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
 * 示例 1:
 * 输入:
 * [2, 3, 1, 0, 2, 5, 3]
 * 输出:2 或 3
 */
public class Offer03 {
    public static void main(String[] args) {
        int[] array2 = {3,3,0,1,7,2,4,5,2,6};
        int result2 = solve2(array2);
        System.out.println(result2);
    }
    private static int solve2(int[] array2) {
        Set<Integer> set = new HashSet<Integer>();
        int repeat = -1;
        for (int i = 0; i < array2.length; i++) {
            if (!set.add(array2[i])){
                repeat = array2[i];
                break;
            }
        }
        return repeat;
    }
}

【注】
(1):leetcode 等平台只要我们完成一个函数即可,本人初出茅庐,为了巩固基本知识,故自己补充了部分代码,用于练手。本代码也许存在漏洞,望高手赐教。感谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值