陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為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查詢是...