題目:
在乙個長度為n的陣列裡的所有數字都在0到n-1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。 例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。
思路:1、因為所有數字都在0-n-1範圍內,將所有數排好序,若前乙個數等於後乙個數,就返回true
classsolution:
#這裡要特別注意~找到任意重複的乙個值並賦值到duplication[0]
#函式返回true/false
defduplicate(self, numbers, duplication):
#首先當然是特殊情況!
n =len(numbers)
if numbers == or n <= 1:
#找重複數字,n=1也返回false
return
false
numbers.sort() #排序
for i in range(0, n-1):
if numbers[i] == numbers[i+1]:
#前乙個和後乙個相等
duplication[0] =numbers[i]
return
true
elif numbers[i] < 0 or numbers[i] >=n:
#因為所有數字都在0到n-1的範圍內,所以數字不能小於0或大於n
return
false
return false
2、可以使用雜湊表。先從頭到尾掃瞄陣列,比對陣列中的值是否在雜湊表中存在,若不存在 -> 將該數加入到雜湊表中;若存在 -> 該數字就是乙個重複的數字
【雜湊表】我理解的是,乙個陣列,每個元素按照一定的雜湊函式,對應到雜湊表當中的某個位址中。-> 如果a元素在按照雜湊函式對應到位址的過程中,與b元素有衝突,那就要採用衝突處理方法。
*python中雜湊表的例子:dict、set:
classsolution:
#這裡要特別注意~找到任意重複的乙個值並賦值到duplication[0]
#函式返回true/false
defduplicate(self, numbers, duplication):
#首先當然是特殊情況!
n =len(numbers)
if numbers == or n <= 1:
#找重複數字,n=1也返回false
return
false
#python中set有用到雜湊表,但是集合中只儲存key,不儲存value
usedhash =set()
for i in
range(0, n): #到n
if numbers[i] < 0 or numbers[i] >=n:
return
false
if numbers[i] not
inusedhash:
usedhash.add(numbers[i])
else
: duplication[0] =numbers[i]
return
true
return false
用例:有乙個或多個重複數字的陣列
沒有重複數字的陣列
空陣列
劍指offer 09 跳台階
題目 乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法 先後次序不同算不同的結果 對於本題,前提只有 一次 1階或者2階的跳法。a.如果兩種跳法,1階或者2階,那麼假定第一次跳的是一階,那麼剩下的是n 1個台階,跳法是f n 1 b.假定第一次跳的是2階,那麼...
劍指offer 09 雙棧實現佇列
棧 先進後出 佇列 先進先出 列表元素 元素1 元素2,元素3 棧的格式 棧底 棧中 棧頂 佇列格式 隊首 隊中 隊尾 操作1 佇列的插入操作 插入元素4 相當於棧頂插入元素4,即對應於入棧操作。操作2 佇列刪除元素1,相當於在隊首刪除元素1,即刪除棧底元素1 但是,棧的插入與刪除都是在棧頂完成的,...
劍指offer 09 斐波那契數列
寫乙個函式,輸入n,求斐波那契數列的第n項。思路 遞迴 順序求 公式。遞迴 重複的節點數會隨著n的增大而急劇增加,這意味著計算量會隨著n的增大而急劇增大。事實上,用遞迴的方法計算的時間複雜度是以n的指數的方式遞增的。順序 從下往上計算,首先計算f 0 和f 1 算出f 2 再根據f 1 和f 2 算...