介紹三種時間複雜度和空間複雜度不同的解法。
# -*- 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查詢是...