劍指offer二刷 陣列專題 陣列中重複的數字

2022-08-04 08:27:11 字數 3173 閱讀 9226

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

最開始想到的是用「字典」,依次記錄每個數字出現的次數,這就要遍歷陣列並且建立字典,感覺空間上占用較大。

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

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

時間複雜度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。

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

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

時間複雜度o(n),空間複雜度o(n)然後我覺得以上兩種方法,空間複雜度都為o(n),應該還有空間複雜度更小的解法。但我想不出來了。

也是利用陣列下標的性質,但是不是新建乙個陣列,而是利用指標。i 從0的位置開始,一定要找到每個 i 對應的數字,即numbers[i]=i,才能繼續下乙個,如果交換過程中發現已經是numbers[i]=i,那麼當前要交換的數字就是重複的數字。

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

時間複雜度o(n),空間複雜度o(1)上述**官方給的步驟:

設定乙個指標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 問題描述 在乙個長度...