📅  最后修改于: 2023-12-03 14:56:43.254000             🧑  作者: Mango
给定一个无序数组,其中有一个元素出现次数超过了数组长度的一半,求这个元素。
遍历整个数组,统计每个元素出现的次数,然后判断哪个元素出现的次数超过了数组长度的一半。
时间复杂度:O(n^2)
代码如下:
def find_majority(arr):
for i in range(len(arr)):
count = 0
for j in range(len(arr)):
if arr[i] == arr[j]:
count += 1
if count > len(arr) / 2:
return arr[i]
return None
将整个数组排序,然后判断中间的元素是否出现次数超过了数组长度的一半。
时间复杂度:O(nlogn)
代码如下:
def find_majority(arr):
arr.sort()
return arr[len(arr) // 2]
遍历整个数组,用一个变量记录当前的候选元素,用另一个变量记录当前候选元素出现次数。当遍历到一个新元素时,如果新元素等于候选元素,则将候选元素出现次数加1,否则将候选元素出现次数减1,当候选元素出现次数变为0时,将候选元素设为新元素,继续遍历数组。
时间复杂度:O(n)
代码如下:
def find_majority(arr):
candidate = None
count = 0
for num in arr:
if count == 0:
candidate = num
count += (1 if num == candidate else -1)
return candidate
本文介绍了三种解法:计数法、排序法和摩尔投票法,其中计数法和排序法的时间复杂度较高,而摩尔投票法的时间复杂度为O(n),是最优解。