陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為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,直到進行到最後,然後再驗證最後留下的數字是否出現次數超過...