数组中重复的数字-数据结构

问题描述

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

关键要求:时间复杂度O(n),空间复杂度O(1)

解题思路

方法一:哈希表法(不符合空间要求但容易理解)

使用哈希表存储已经遍历过的数字,当遇到重复数字时返回。

时间复杂度:O(n)
空间复杂度:O(n)

方法二:原地交换法(最优解)

利用题目中"数字范围在0~n-1"的特性,通过原地交换使数字i出现在第i个位置上。如果发现冲突,则找到重复数字。

时间复杂度:O(n)
空间复杂度:O(1)

代码实现

Java实现

/**
 * 原地交换法实现
 */
public int findRepeatNumber(int[] nums) {
    for (int i = 0; i < nums.length; i++) {
        // 当前数字不在正确位置上
        while (nums[i] != i) {
            // 如果目标位置已经有正确数字,说明重复
            if (nums[nums[i]] == nums[i]) {
                return 

你可能感兴趣的:(python,开发语言)