劍指offer第3 陣列中重複的數字

2021-08-21 21:15:17 字數 1914 閱讀 1501

在乙個長度為n的陣列裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。 例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。

# -*- coding:utf-8 -*-

class solution:

# 這裡要特別注意~找到任意重複的乙個值並賦值到duplication[0]

# 函式返回true/false

def duplicate(self, numbers, duplication):

# write code here

if len(numbers)<=1:

return false

i=0while i<=len(numbers):

m=numbers[i]

if m==i:

i+=1

else:

if numbers[i]==numbers[m]:

return true

else :

temp=numbers[i]

numbers[i]=numbers[m]

numbers[m]=temp

i+=1

return false

題目2:題目描述: 

在乙個長度為n+1的陣列裡的所有數字都在1~n的範圍內,所以陣列中至少有乙個數字是重複的。請找出陣列中任意乙個重複的數字,但是不能修改輸入的陣列。

def find_dux_num(seq):

if len(seq) <= 1 or seq is none:

return none

start, end = 1, len(seq) - 1 # 獲取數字1,n

while start <= end:

mid = (start+end) // 2 # 獲取中間數字

count = count_num(seq, start, mid) # 計算[start, mid]數字之間的數目

# 當隻取到乙個數字時,如果該數字出現數目大於1,就是重複數字

if start == end:

if count > 1:

return start

else:

break

# 如果count數目 > 中間數字到起始數字之差,一定存在重複數字,繼續在這一段中求中間數比較

if count > mid - start + 1:

end = mid

# 否則在後一段中求中間數比較

else:

start = mid + 1

return none

def count_num(seq, start, end):

count = 0

for i in seq:

if start <= i <= end:

count += 1

return count

if __name__ == '__main__':

print(find_dux_num([1, 2, 3, 4, 3]))

有詳細的介紹

這種方法雖然不需要輔助空間o(n),但是後面每半個區間都需要遍歷整個陣列,函式countnum將被呼叫o(logn)次,每次需要o(n)的時間,因此總的時間複雜度是o(nlogn),空間複雜度為o(l)。相當於用時間換空間了。 

現在來總結下關於陣列中重複數字的問題,利用輔助空間的話,時間和空間複雜度都是o(n);利用下標於數字對應關係的話時間複雜度是o(n),空間複雜度是o(l),但是需要改變陣列;利用二分查詢類似思路的方法,時間複雜度是o(nlogn),空間複雜度o(l),所以要問清楚面試官他想要空間效率高的呢?還是時間效率高的呢?能不能改變陣列呢?一方面體現交流能力,一方面能最快的寫出答案。

還剩乙個輔助空間法。

劍指offer (3)陣列中重複的數字

題目描述 題目 在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是重複的數字2或者3。程式 include include include...

劍指offer 3 陣列中重複的數字

在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。使用hashset去重 如果新增不成功說明出現了重複的元素 返回。public intfindrepeatnu...

劍指offer 3 陣列中重複的數字

變試 不修改陣列找重複陣列 在乙個長度為n的陣列裡的所有數字都在0 n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字 n 7 輸出 2或3 陣列中的數字在0 n 1的範圍內 如果沒有重複的數字,當陣列排序後數字 i 應該出現...