《劍指offer》陣列中出現次數超過一半的數字

2021-08-22 13:35:39 字數 1080 閱讀 1292

陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。

先排序,統計次數,超過一半就停止迴圈。

這裡用sorted()排序,在做筆試的題的時候很快,但是在面試的時候,面試官會希望你排序的內容也要寫出來,那麼排序最快也得o(nlogn),演算法的複雜度就高了。因此,該方法只在想不出優化的時候用,推薦後面的解法。

class

solution:

defmorethanhalfnum_solution

(self, numbers):

# write code here

if (len(numbers) == 0):

return

0 halflen = len(numbers) / 2

numbers = sorted(numbers)

i = 0

count = 1

while (i < len(numbers)):

if ((i + 1

<= (len(numbers) - 1) and numbers[i] == numbers[i + 1] )):

count = count + 1

if (count > halflen):

return numbers[i]

else:

if (count > halflen):

return numbers[i]

else:

count = 1

i = i + 1

return

0

首先題幹說明找的數一定存在,那麼數的個超過了陣列的一半,陣列最中間的數一定是我們找的數,所以該問題等於找乙個陣列的中位數。接下來考慮如何找中位數。

利用partition的思想

快排的核心方法是partition函式,它的作用就是將整個陣列分成小於基準值的左邊,和大於基準值的右邊。

那麼對於陣列,隨機選取乙個數,比它小的放左邊,比它大的放右邊,如果該數的下標剛好為n/2,該數就是中位數。如果下標

劍指offer 陣列在排序陣列中出現的次數

記錄次數,直接用data.count k 也通過了。或者常規演算法,出現有序用二分查詢。class solution def getnumberofk self,data,k write code here if len data 0 return 0 count 0 low 0 high len ...

劍指offer第39 陣列中出現次數超過一半的數字

陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。coding utf 8 classsolution defmorethanhalfnum solution self numb...

劍指Offer 028陣列中出現次數超過一半的陣列

028陣列 現次數超過一半的陣列 題目 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列 現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0 方法 map統計法 思路 遍歷陣列,用map來記錄每個數出現的次數,最後再遍歷map查詢是...