剑指 Offer 03. 数组中重复的数字

题目描述

找出数组中重复的数字。

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

输入输出

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

基本思路

1
2
3
4
5
6
互相交换
[2,3,1,0,2,5,3]
[1,3,2,0,2,5,3]
[3,1,2,0,2,5,3]
[0,1,2,3,2,5,3]
找nums[4]时发现nums[nums[2]] == nums[4] == nums[2] 返回

java实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public int findRepeatNumber(int[] nums) {
int i = 0;
while(i < nums.length){
if(nums[i] == i){
i++;
continue;
}
if(nums[nums[i]] == nums[i]){
return nums[i];
}
swap(nums, i, nums[i]);
}
return -1;
}

public void swap(int[] nums, int a, int b){
int tmp = nums[a];
nums[a] = nums[tmp];
nums[tmp] = tmp;
}
}