[劍指Offer] 陣列中重複的數字(Python)
阿新 • • 發佈:2019-01-11
題目描述
在一個長度為n的數組裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意一個重複的數字。 例如,如果輸入長度為7的陣列{2,3,1,0,2,5,3},那麼對應的輸出是第一個重複的數字2。
思路
思路一:用Bool陣列存放flag
思路二:從下標0開始,對每個元素,若numbers[i]不等於i,則交換numbers[i]和numbers[numbers[i]],直至i和numbers[i]相等繼續迴圈,或numbers[i]和numbers[numbers[i]]相等即遇到重複元素返回True。
程式碼
###思路一
# -*- coding:utf-8 -*-
class Solution:
# 這裡要特別注意~找到任意重複的一個值並賦值到duplication[0]
# 函式返回True/False
def duplicate(self, numbers, duplication):
# write code here
if numbers is None or len(numbers) == 0:
return False
for i in numbers:
if i < 0 or i >= len(numbers):
return False
f_arr = [False] * len(numbers)
for i in range(len(numbers)):
if f_arr[numbers[i]] == True:
duplication[0] = numbers[i]
return True
f_arr[numbers[i]] = True
return False
###思路二
# -*- coding:utf-8 -*-
class Solution:
# 這裡要特別注意~找到任意重複的一個值並賦值到duplication[0]
# 函式返回True/False
def duplicate(self, numbers, duplication):
# write code here
if numbers is None or len(numbers) == 0:
return False
for i in numbers:
if i < 0 or i >= len(numbers):
return False
for i in range(len(numbers)):
while i != numbers[i]:
if numbers[i] == numbers[numbers[i]]:
duplication[0] = numbers[i]
return True
tmp = numbers[numbers[i]]
numbers[numbers[i]] = numbers[i]
numbers[i] = tmp
return False
時空複雜度
思路一:時間複雜度,空間複雜度。
思路二:時間複雜度,空間複雜度。