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