在乙個長度為n的陣列裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。 例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。
最開始想到的是用「字典」,依次記錄每個數字出現的次數,這就要遍歷陣列並且建立字典,感覺空間上占用較大。
# -*- coding:utf-8 -*-時間複雜度o(n),空間複雜度o(n)然後想到用陣列代替字典,因為陣列內所有數字都在0到n-1的範圍內,那麼我可以建立乙個大小為n的陣列a,初始值都為0,利用陣列下標記錄a[i]是否為0。如果a[i]==0,那麼說明該數字是第一次遍歷到,令a[i]=1;如果a[i]==1,那麼說明該數字是第二次遍歷到,該數字重複,令duplication[0]=i,返回true;如果遍歷完全後沒有return false,那麼就return true。class solution:
# 這裡要特別注意~找到任意重複的乙個值並賦值到duplication[0]
# 函式返回true/false
def duplicate(self, numbers, duplication):
# write code here
dic={}
for i in numbers:
if i in dic:
duplication[0]=i
return true
else: dic[i]=1
return false
# -*- coding:utf-8 -*-時間複雜度o(n),空間複雜度o(n)然後我覺得以上兩種方法,空間複雜度都為o(n),應該還有空間複雜度更小的解法。但我想不出來了。class solution:
# 這裡要特別注意~找到任意重複的乙個值並賦值到duplication[0]
# 函式返回true/false
def duplicate(self, numbers, duplication):
# write code here
if len(numbers)==0: return false
a=[0]*len(numbers)
for i in numbers:
if not a[i]: a[i]=1
else:
duplication[0]=i
return true
return false
也是利用陣列下標的性質,但是不是新建乙個陣列,而是利用指標。i 從0的位置開始,一定要找到每個 i 對應的數字,即numbers[i]=i,才能繼續下乙個,如果交換過程中發現已經是numbers[i]=i,那麼當前要交換的數字就是重複的數字。
1時間複雜度o(n),空間複雜度o(1)上述**官方給的步驟:#-*- coding:utf-8 -*-
2class
solution:3#
這裡要特別注意~找到任意重複的乙個值並賦值到duplication[0]4#
函式返回true/false
5def
duplicate(self, numbers, duplication):6#
write code here7if
not numbers or len(numbers)==0:return
false
8for i in
range(len(numbers)):
9while i!=numbers[i]:
10if numbers[i]==numbers[numbers[i]]:
11 duplication[0]=numbers[i]
12return
true13#
swap14#
numbers[i],numbers[numbers[i]] = numbers[numbers[i]],numbers[i]不可行
15 tmp=numbers[i]
16 numbers[i]=numbers[numbers[i]]
17 numbers[tmp]=tmp
18return false
設定乙個指標i指向開頭0,
對於arr[i]進行判斷,如果arr[i] == i, 說明下標為i的資料正確的放在了該位置上,讓i++
如果arr[i] != i, 說明沒有正確放在位置上,那麼我們就把arr[i]放在正確的位置上,也就是交換
arr[i] 和arr[arr[i]]。交換之後,如果arr[i] != i, 繼續交換。
如果交換的過程中,arr[i] == arr[arr[i]],說明遇到了重複值,返回即可。
如下圖:
使用set函式可以刪除無序陣列中重複的數字。
使用 collections.counter.most_common(1) 可以找到陣列中重複最多的數字。
1#-*- coding:utf-8 -*-\
2from collections import
counter
3class
solution:4#
這裡要特別注意~找到任意重複的乙個值並賦值到duplication[0]5#
函式返回true/false
6def
duplicate(self, numbers, duplication):7#
write code here
8if len(numbers)==0 or
not numbers:return
false
9if len(numbers)==len(set(numbers)):return
false
10 duplication[0]=counter(numbers).most_common(1)[0][0]
11return true
劍指offer 陣列
資料是最簡單的資料結構,它佔據一塊連續的記憶體並按照順序儲存資料。建立陣列時,首先指點陣列的容量大小,然後根據大小分配記憶體。缺點 空間效率不高。經常有空閒的區域滅有得到充分利用。優點 時間效率很高。可以根據時間效率高的特點,來實現簡單的雜湊表 把陣列的下標設為雜湊表的鍵值,陣列中的每乙個數字設為雜...
劍指offer 陣列
public class 03 陣列中的重複數字 swap number,number i i return 1 交換 public void swap int number,int i,int j public class 03 陣列中的重複數字 return 1 public intfindre...
劍指offer 陣列
問題描述 在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。function find target,array return false 問題描述 在乙個長度...