本题来自 LeetCode 中国网站,属于算法面试中的一道​经典高频考题​。题解由 Doocs 开源社区 leetcode 项目维护者提供。


目前已经有超过 50 位开发者参与了此项目,期待你的加入!


项目地址:https://github.com/doocs/leetcode

高频考题!数组中找重复数字(算法 NO.1)_开源社区

题目描述

找出数组中重复的数字。

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

示例 1:

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

限制:

2 <= n <= 100000

解法

0~n-1 范围内的数,分别还原到对应的位置上,如:数字 2 交换到下标为 2 的位置。

若交换过程中发现重复,则直接返回。

Python3

class Solution:
def findRepeatNumber(self, nums: List[int]) -> int:
for i, num in enumerate(nums):
while i != num:
if num == nums[num]:
return num
nums[i], nums[num] = nums[num], nums[i]
num = nums[i]
return -1

Java

class Solution {
public int findRepeatNumber(int[] nums) {
for (int i = 0, len = nums.length; i < len; ++i) {
while (i != nums[i]) {
if (nums[i] == nums[nums[i]]) {
return nums[i];
}
swap(nums, i, nums[i]);
}
}
return -1;
}
private void swap(int[] nums, int i, int j) {
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
}

长按识别下图二维码,关注公众号「​Doocs开源社区​」,第一时间跟你们分享好玩、实用的技术文章与业内最新资讯。