📅  最后修改于: 2023-12-03 15:42:21.238000             🧑  作者: Mango
这道题是门|门 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
这道题其实并不难,但是要注意代码的可读性和效率。选择合适的解法可以让代码更简洁、清晰、高效。