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

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

算法 | 排序 | 问题4

问题描述

给定一个数组,其中有一个数字出现的次数超过了数组长度的一半,请找出这个数字。

解决方案
方法1:排序

先将数组排序,再遍历一遍数组,遇到相同的数字就计数器加1,如果当前数字和上一个数字不同,则重置计数器。最后如果计数器大于数组长度的一半,说明这个数字出现次数超过了数组长度的一半。

代码如下:

def find_majority_number(nums):
    nums.sort()
    count = 1
    for i in range(1, len(nums)):
        if nums[i] == nums[i-1]:
            count += 1
        else:
            count = 1
        if count > len(nums) // 2:
            return nums[i]
    return None
方法2:摩尔投票算法

摩尔投票算法是一种时间复杂度为 O(n),空间复杂度为 O(1) 的算法。基本思想是遍历数组,维护一个当前数字和一个计数器。如果当前数字和之前的一致,则计数器加1,否则计数器减1。如果计数器变为0,则将当前数字设为下一个数字,统计下一个数字的出现次数。遍历完数组后,留下来的数字就可能是出现次数超过一半的数字,但是我们还需要遍历一遍数组来确认它是否真的是出现次数超过一半的数字。

代码如下:

def find_majority_number(nums):
    count = 0
    candidate = None
    for num in nums:
        if count == 0:
            candidate = num
        count += 1 if candidate == num else -1
    count = 0
    for num in nums:
        if num == candidate:
            count += 1
    return candidate if count > len(nums) // 2 else None
总结

以上就是两种解决方案,排序的解法相对简单,但时间复杂度较高;摩尔投票算法虽然时间复杂度低,但是谨防伪装问题出现,最好再遍历一遍数组来确认是否真的是出现次数超过一半的数字。