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

2021-09-12 15:37:06 字數 1519 閱讀 1644

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

用python真的好簡單哦╮( ̄▽ ̄)╭(貌似複雜度上o(n^2))

class solution:

def morethanhalfnum_solution(self, numbers):

for i in numbers:

if numbers.count(i)>len(numbers)/2:

return i

return 0

然鵝,這題不是這麼考的。。。。。。。。

兩種思路

思路一(複雜度o(n))

某數字出現次數超過陣列長度一半,則陣列快排一遍(複雜度onlgn())後中位數就是該數

但是要進行一遍驗證該陣列是否是合格的陣列(真的有超過長度一半的數)複雜度o(n);是的話返回該數否則返回0

class solution:

def morethanhalfnum_solution(self, numbers):

numbers=sorted(numbers)

if numbers.count(numbers[len(numbers)/2])>len(numbers)/2:

return numbers[len(numbers)/2]

else:

return 0

思路二(複雜度o(n))

請看牛客大神解釋:

cm問前程 :採用陣地攻守的思想:

第乙個數字作為第乙個士兵,守陣地;count = 1;

遇到相同元素,count++;

遇到不相同元素,即為敵人,同歸於盡,count--;當遇到count為0的情況,又以新的i值作為守陣地的士兵,繼續下去,到最後還留在陣地上的士兵,有可能是主元素。

再加一次迴圈,記錄這個士兵的個數看是否大於陣列一般即可。

然後本人自己敲的python:

class solution:

def morethanhalfnum_solution(self, numbers):

result=numbers[0]

times=0

for i in numbers[1:]:

if(times == 0):

result = i

times = 1

elif i==result:

times+=1

else:

times-=1

#下面找到result的次數

times=0

for j in numbers:

if result == j:

times+=1

#判斷times是否符合要求

if(times>len(numbers)/2):

return result

else:

return 0

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

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

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

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

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

陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。如果某個數符合條件,它一定是中位數。因此,找出中位數。如果乙個數num,左邊比它小,右邊比它大,它的下標是index。如果ind...