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

2021-09-12 00:02:11 字數 1837 閱讀 3475

介紹三種時間複雜度和空間複雜度不同的解法。

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

class solution:

def morethanhalfnum_solution(self, numbers):

# write code here

# 一、雜湊表計數

# 時間複雜度:o(n),空間複雜度:o(n)

num_map = {}

for i in set(numbers):

num_map[i] = 0

for i in numbers:

num_map[i] += 1

n = len(numbers)

for key in num_map:

if num_map[key] > n/2:

return key

return 0

# 二、快速排序,計算中位數

# 時間複雜度:o(nlogn)空間複雜度:o(1)

def quick_sort(nums,left,right):

if left >= right:

return

index1,index2 = left,right

key = nums[left]

while left < right:

while left < right and nums[right] >=key:

right -= 1

nums[left] = nums[right]

while left < right and nums[left] < key:

left += 1

nums[right] = nums[left]

nums[left] = key

quick_sort(nums,index1,left)

quick_sort(nums,left+1,index2)

if len(numbers) < 1:

return 0

left = 0

right = len(numbers)-1

quick_sort(numbers,left,right)

# 判斷中位數是否符合條件

target = numbers[(right+1)/2]

count = 0

for num in numbers:

if target == num:

count += 1

return target if count > len(numbers)/2 else 0

# 三、比較次數,如果有符合條件的數字,則它出現的次數比其他所有數字出現的次數和還要多。

# 時間複雜度:o(n),空間複雜度:o(1)

if len(numbers) < 0:

return 0

result = numbers[0]

times = 1

for i in range(1,len(numbers)):

if result == numbers[i]:

times += 1

else:

if times:

times -= 1

else:

result = numbers[i]

times = 1

# 判斷result是否滿足條件

times = 0

for num in numbers:

if result == num:

times += 1

return result if times > len(numbers)/2 else 0

劍指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查詢是...