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

2021-08-08 11:44:21 字數 1385 閱讀 7824

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

如果某個數符合條件,它一定是中位數。因此,找出中位數。

如果乙個數num,左邊比它小,右邊比它大,它的下標是index。如果index < middle,那麼中位數在它右邊,反之,中位數在它左邊。

通過partition,下標為middle的值,它就是中位數。

根據中位數,判斷是否符合條件。

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

class

solution:

defmorethanhalfnum_solution

(self, numbers):

# write code here

middle = int(len(numbers) / 2)

start = 0

end = len(numbers) - 1

index = self.partition(numbers, start, end)

while index != middle:

if index < middle:

start = index + 1

index = self.partition(numbers, start, end)

elif index > middle:

end = index - 1

index = self.partition(numbers, start, end)

num = numbers[middle]

count = 0

for tmp in numbers:

if tmp == num:

count += 1

if count > middle:

return num

return

0def

partition

(self, numbers, start, end):

key = numbers[start]

s = start

e = end

while s < e:

while numbers[e] >= key and s < e:

e -= 1

while numbers[s] <= key and s < e:

s += 1

if s < e:

numbers[s], numbers[e] = numbers[e], numbers[s]

numbers[start], numbers[s] = numbers[s], numbers[start]

return s

劍指Offer29陣列中出現次數超過一半的數字

題目 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2.分析 看到這個題的時候我首先想的是加乙個輔助陣列,統計出每乙個數出現的次數,因為題目中給的陣列是不知道的所以不能用雜湊儲存的方法,那麼只能用普...

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

題目 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。拿到題目的第一反應是將陣列排序,然後判斷陣列中間的數字長度是否超過陣列長度的一半。若陣列中出現最多次數的數字為0且長度超過...

offer29 陣列中出現次數超過一半的數字

coding utf 8 offer29 最開始儲存兩個數值 陣列中的乙個數字以及它出現的次數,然後遍歷,如果下乙個數字等於這個數字,那麼次數加一,如果不等,次數減一,當次數等於0的時候,在下乙個數字的時候重新複製新的數字以及出現的次數置為1,直到進行到最後,然後再驗證最後留下的數字是否出現次數超過...