题目描述:
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
解题思路:
第一种解题思路:最简单的,暴力破解:
整个数组从第一个数字开始,遍历第一个数字之后所有数字寻找是否有与第一个数字重复的数字,没有在从第二个开始在循环遍历第二个数字之后的所有数字寻找与第二个数字是否有重复的数字,以此类推,直到查找完数组中所有元素。
python代码实现如下:
'''
在一个长度为n的数组里的所有数字都在0到n-1的范围内。
数组中某些数字是重复的,但不知道有几个数字是重复的。
也不知道每个数字重复几次。请找出数组中任意一个重复的数字。
例如,如果输入长度为7的数组{2,3,1,0,2,5,3},
那么对应的输出是第一个重复的数字2。
'''
class Solution:
# 这里要特别注意~找到任意重复的一个值并赋值到duplication[0]
# 函数返回True/False
def duplicate(self, numbers, duplication):
# write code here
n=len(numbers)
for i in range(0,n):
for j in range(i+1,n):
if numbers[i] == numbers[j]:
duplication[0]=numbers[j]
return True
return False
if __name__ == '__main__':
s=Solution()
print(s.duplicate([2,3,2,4],[None]))
第二种解题思路:
题目中指出了一个长度为n的数组里的所有数字都在0到n-1的范围内,也就是说,数组里的元素值字最大也不会超过n,
假设一个数组长度是6,这个数组中的元素值只可能是 0 1 2 3 4 5 这几个数。那么就可以这样考虑这个问题,我们使用元素值作为索引,他不会超出数组索引范围,当我们用元素值作为数组的下标索引时,将索引到的元素+n ,遇到下一次重复的元素时,用它作为下标去索引到的元素就会大于n, 证明这个元素之前被索引到,进而能证明下标索引就是数组中重复的元素。
举一个简单的例子更好的理解上面的那段话。
A= [2, 0,1,2] 可以看出这个数组长度是 4
我们从头遍历数组
将A[0]元素 2 作为下标索引 index 即 变成了 A[index] = A[2] 然后将A[2]的值加长度n,这里就是加4. 然后A[2]= 5了
数组A就变成了 A=[2,0,5,2],然后再将A[1]元素 0 作为下标索引 index 即 变成了 A[index] = A[0] 然后A[0]= 6了
这些都不重要,
依次遍历,知道最后 到将A[3]元素 2 作为下标索引 index 即 A[index] = A[2] 我们之前将A[2]+ 4 了
A[2]的值大于数组长度 n, 所以这里能判断出之前索引过 A[2] 所以数组下标 2 是 数组中重复的数字。
也是数组中第一次出现重复的数字。
python实现代码如下:
# -*- coding:utf-8 -*-
class Solution:
# 这里要特别注意~找到任意重复的一个值并赋值到duplication[0]
# 函数返回True/False
def duplicate(self, numbers, duplication):
# write code here
n=len(numbers)
for i in range(0,n):
index = numbers[i]
if index>=n:
index-=n
if numbers[index]>=n:
duplication[0]=index
return True
numbers[index]+=n
return False
第三种解题思路:
????