剑指 Offer 之 数组中重复的数字
Contents
在一个长度为 n
的数组里的所有数字都在 0
到 n-1
的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。
分析
假如数组为 {2, 3, 1, 0, 2, 5}
,则输出为 2
。如果要求不能使用排序,也不能使用额外的标记,我们可以利用 所有数字都在 0 到 n-1 的范围内
这一特点。从头到尾依次扫描数组中的数字,将值为 i
的元素调整到数组索引为 i
的位置。
首先,数组索引为 0
的元素是 2
,而索引位置为 2
的元素是 1
,由于不相等,所以交换位置,交换后的数组为 {1, 3, 2, 0, 2, 5}
;接着数组索引为 0
的元素是 1
,而索引位置为 1
的元素是 3
,再交换位置,交换后的数组为 {3, 1, 2, 0, 2, 5}
;再看数组索引为 0
的元素是 3
,而索引位置为 3
的元素是 0
,由于不相等,再交换位置,交换后的数组为 {0, 1, 2, 3, 2, 5}
,此时 {0, 1, 2, 3}
都已经排好位置了。再遍历到第四个元素 3
时,由于索引位置为 2
的元素已经是 2
了,所以就找到了一个重复的元素。
实现
|
|
详解
第 2~5
行进行边界检查。第 6
行开始遍历数组中的元素,其中 while
循环只要第 i
元素和 i
不相等,就交换位置。但是第 8
行,如果发现原来的位置已经有对应的元素了,那么就返回重复的元素。