📜  算法|排序|问题12(1)

📅  最后修改于: 2023-12-03 14:56:43.254000             🧑  作者: Mango

算法 | 排序 | 问题12

问题描述

给定一个无序数组,其中有一个元素出现次数超过了数组长度的一半,求这个元素。

解法
思路1:计数法

遍历整个数组,统计每个元素出现的次数,然后判断哪个元素出现的次数超过了数组长度的一半。

时间复杂度: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
思路2:排序法

将整个数组排序,然后判断中间的元素是否出现次数超过了数组长度的一半。

时间复杂度:O(nlogn)

代码如下:

def find_majority(arr):
    arr.sort()
    return arr[len(arr) // 2]
思路3:摩尔投票法

遍历整个数组,用一个变量记录当前的候选元素,用另一个变量记录当前候选元素出现次数。当遍历到一个新元素时,如果新元素等于候选元素,则将候选元素出现次数加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),是最优解。