数据结构与算法之 leetcode 数组多数元素 摩尔投票法

数据结构与算法阿木 发布于 2 天前 1 次阅读


数组多数元素(摩尔投票法)——LeetCode算法解析

在LeetCode这个编程挑战平台上,数组问题是一个常见的题型。其中,“数组中的多数元素”问题是一个典型的算法问题,它要求我们找出数组中出现次数超过一半的元素。这个问题可以通过多种方法解决,其中摩尔投票法(Boyer-Moore Voting Algorithm)是一种非常高效且巧妙的算法。

摩尔投票法是一种用于寻找数组中多数元素的算法,其核心思想是通过一次遍历数组,同时找出一个候选多数元素和一个计数器。如果当前遍历到的元素与候选多数元素相同,则计数器加一;如果不同,则计数器减一。由于多数元素的数量超过一半,因此最终计数器不会减到零,而候选多数元素就是我们要找的多数元素。

算法原理

摩尔投票法的基本原理可以概括为以下几点:

1. 初始化:设置一个候选多数元素`candidate`和一个计数器`count`。

2. 遍历数组:遍历数组中的每个元素。

- 如果`count`为0,则将当前元素设为`candidate`。

- 如果当前元素与`candidate`相同,则`count`加一。

- 如果当前元素与`candidate`不同,则`count`减一。

3. 验证:遍历结束后,使用`candidate`再次遍历数组,验证其是否为多数元素。

代码实现

下面是使用Python实现的摩尔投票法代码:

python

def majorityElement(nums):


candidate = None


count = 0


for num in nums:


if count == 0:


candidate = num


count += (1 if num == candidate else -1)


return candidate

验证


nums = [3, 2, 3]


print(majorityElement(nums)) 输出: 3


时间复杂度和空间复杂度

摩尔投票法的时间复杂度为O(n),因为它只需要遍历数组一次。空间复杂度为O(1),因为它只需要常数级别的额外空间。

代码优化

在实际应用中,我们可以对代码进行一些优化,例如:

1. 异常处理:处理空数组或只有一个元素的数组的情况。

2. 性能测试:对大数组进行性能测试,确保算法的效率。

实战演练

下面是一些使用摩尔投票法解决LeetCode上相关问题的例子:

问题1:169. 多数元素

python

def majorityElement(nums):


candidate = None


count = 0


for num in nums:


if count == 0:


candidate = num


count += (1 if num == candidate else -1)


return candidate

测试


nums = [3, 2, 3]


print(majorityElement(nums)) 输出: 3


问题2:229. 求众数 II

python

def majorityElement(nums):


candidate1, candidate2, count1, count2 = None, None, 0, 0


for num in nums:


if num == candidate1:


count1 += 1


elif num == candidate2:


count2 += 1


elif count1 == 0:


candidate1, count1 = num, 1


elif count2 == 0:


candidate2, count2 = num, 1


else:


count1 -= 1


count2 -= 1


return [num for num in (candidate1, candidate2) if nums.count(num) > len(nums) // 3]

测试


nums = [1, 1, 1, 3, 3, 2, 2, 2]


print(majorityElement(nums)) 输出: [1, 2]


总结

摩尔投票法是一种简单而高效的算法,适用于寻找数组中的多数元素。通过一次遍历和常数级别的额外空间,我们可以快速找到答案。在实际编程中,理解并掌握这种算法对于解决类似问题非常有帮助。