在乙個長度為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 應該出現...