题目描述
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
解题思路:
.从头开始扫描数组,当扫描到的数组元素下标为i,首先判断第i位元素的值是否为i, 若是,则接着扫描下一位数字;若不是且第 i 位元素值为m,将m与数组第m位的元素值比较,若相等,则返回该重复数字m,否则将第i与m位的元素交换位置,并按上述步骤继续比较第i位的元素,直到发现第一个重复数字。
1.输出的是随机的重复数字,不一定是第一个,实测题目要求随机找一个即可
1 class Solution: 2 # 这里要特别注意~找到任意重复的一个值并赋值到duplication[0] 3 # 函数返回True/False 4 def duplicate(self, numbers, duplication): 5 # write code here 6 index = 0 7 while index < len(numbers): 8 if numbers[index] == index: #只有在元素的值与下标相等时,index才加一,不加一时会对该位置的元素进行新一轮if判断 9 index += 1 #通过控制index加一的位置,实现了一轮循环,不过这种计数变量,即index放在if条件中的情况比较少,容易造成死循环
#这里是因为有个前提,就是几轮交换过后。if条件总会满足。
10 elif numbers[index] == numbers[numbers[index]]: 11 duplication[0] = numbers[index] 12 return True 13 else: 14 index_2 = numbers[index] 15 numbers[index],numbers[index_2] = numbers[index_2],numbers[index] 16 return False
2.同样的思路,代码更简洁,时间复杂度都是o(n)
class Solution: # 这里要特别注意~找到任意重复的一个值并赋值到duplication[0] # 函数返回True/False def duplicate(self, numbers, duplication): # write code here for i in range(len(numbers)): while/if numbers[i] != i: temp = numbers[numbers[i]] if temp == numbers[i]: duplication[0] = numbers[i] return True else: numbers[numbers[i]] = numbers[i] numbers[i] = temp return False
上面的else条件里
temp = numbers[i]
numbers[i] = numbers[numbers[i]]
numbers[temp]=temp
这样写是对的
temp = numbers[i]
numbers[i] = numbers[numbers[i]]
numbers[numbers[i]]=temp
这样就会死循环,因为第三行numbers[numbers[i]]中的numbers[i]已经不是原来位置的numbers[i]了。这个情况之前没遇见过,需要注意。
3.哈希法,输出的是第一个重复的数字
class Solution: # 这里要特别注意~找到任意重复的一个值并赋值到duplication[0] # 函数返回True/False def duplicate(self, numbers,duplication): dic = {} for num in numbers: if not num in dic: dic[num] = 1 else: dic[num] += 1 for num in numbers: if dic[num] != 1: duplication[0] = num return True return False
4.辅助空间
class Solution: # 这里要特别注意~找到任意重复的一个值并赋值到duplication[0] # 函数返回True/False def duplicate(self, numbers, duplication): # write code here if numbers == None or numbers == []: return False #边界条件 s = [] for i in numbers: if i in s: duplication[0] = i return True s.append(i) return False