📅  最后修改于: 2023-12-03 14:50:47.958000             🧑  作者: Mango
这是一道有关搜索算法的题目,题目描述如下:
给定一个排序后的整数数组,找到一个元素使得其出现次数超过数组长度的一半。如果不存在,则返回 -1。
例如,给定数组 [2,2,1,1,1,2,2],返回 2。
这是一个经典的问题,也是很多面试中会被问到的问题。
为了解决这个问题,我们可以考虑用摩尔投票算法。这个算法的核心思想是,我们维护一个候选数,遇到相同的数则计数器加 1,遇到不同的数则计数器减 1。当计数器减到 0 时,将当前数作为候选数。遍历完整个数组之后,我们得到的候选数就是出现次数超过数组长度一半的那个数,如果没有这样的数则返回 -1。
代码实现如下:
def find_majority_element(nums):
candidate, count = None, 0
for num in nums:
if count == 0:
candidate = num
count += 1 if num == candidate else -1
return candidate if nums.count(candidate) > len(nums) // 2 else -1
这个算法的时间复杂度是 O(n),空间复杂度是 O(1)。