1.问题形式化

输入:n个数组成的无序数组arr,数值为0~n-1;

输出:数组中任意一个重复的数。

2.题目分析

(注:参考鸠摩罗什)

要求时间复杂度为O(n),直接用排序来找重复数字最快也要O(nlogn)。因此,不能直接排序,题目中一个隐含信息是n个数的数值在0~n-1之间,因此可以通过如下方式进行:

遍历数组,从前往后将数组中的每个数放到该数数值对应的位置上,每次放置时只需判断要放置的位置的数值与该数数值是否相等即可,如果相等,直接返回该数即可。

alt

3.伪代码

def multi_numbers(arr,n):
	i=0
    while i<n do:
    	if arr[i]==i then
        	i+=1
        else then:
        	if arr[i]==arr[arr[i]] then
            	return arr[i]
            else then:
            	swap(arr[i],arr[arr[i]])
            end if
        end if
    end while
    return -1
    

4.python代码

    def duplicate(self , numbers: List[int]) -> int:
        # write code here
        n=len(numbers)
        i=0
        while i<n:
            if numbers[i]==i:
                i+=1
            else:
                if numbers[i]==numbers[numbers[i]]:
                    return numbers[i]
                else:
                    numbers[numbers[i]],numbers[i]=numbers[i],numbers[numbers[i]]
        return -1