📜  门|门 IT 2005 |第 53 题(1)

📅  最后修改于: 2023-12-03 15:42:21.238000             🧑  作者: Mango

门|门 IT 2005 |第 53 题

这道题是门|门 IT 2005年的第53题,考察的是程序员的算法能力和编程思维。

题目描述

有一个无序的整数数组,数组中有一个数字出现的次数超过了数组长度的一半,请找出这个数字。

解题思路
解法一

我们可以遍历整个数组,用一个字典来统计每个数字出现的次数。然后再遍历一遍字典,找出出现次数大于数组长度一半的数字即可。

时间复杂度为O(n),空间复杂度为O(n),代码如下:

def find_majority_number(nums):
    n = len(nums)
    dict = {}
    for i in nums:
        dict[i] = dict.get(i, 0) + 1
        if dict[i] > n // 2:
            return i
解法二

因为目标数字的个数大于数组长度的一半,我们可以采用投票算法,即遍历数组时,如果碰到和之前的数字相同的数字就+1,否则-1,当count为0时,就重新记录当前数字。最后剩下的数字即为所求。

时间复杂度为O(n),空间复杂度为O(1),代码如下:

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

这道题其实并不难,但是要注意代码的可读性和效率。选择合适的解法可以让代码更简洁、清晰、高效。