剑指offer-3.数组中的重复数字
题目描述
在一个长度为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
posted on 2020-04-24 16:50 LenleDaytoy 阅读(153) 评论(0) 收藏 举报
浙公网安备 33010602011771号