在研究Leetcode 169. 多数元素中发现一种实现算法方案,做了一个学习和总结,那就是:摩尔投票算法。
169.多数元素 问题如下:
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1:
输入: nums = [3,2,3]
输出: 3
示例 2:
输入: nums = [2,2,1,1,1,2,2]
输出: 2
摩尔投票算法是一种用于在数组中找出出现次数超过一半的元素的高效算法。它在处理这个问题时只需要O(n)的时间复杂度和O(1)的空间复杂度。以下是摩尔投票算法的详细介绍: 摩尔投票算法的核心思想是利用“候选人”和“计数器”来识别数组中可能的主元素(出现次数超过一半的元素)。算法通过两个主要步骤来实现:
-
候选元素选择:
- 遍历数组,用一个计数器跟踪当前候选元素。如果计数器为零,则更新候选元素为当前遍历到的元素,并将计数器设为1。
- 如果当前元素与候选元素相同,则增加计数器。如果不同,则减少计数器。
- 这个步骤保证了最后剩下的候选元素是数组中出现次数最多的元素(如果存在)。
-
验证候选元素:
- 在第一次遍历结束后,候选元素可能是数组中出现次数最多的元素,但还需要验证它是否真的出现次数超过数组长度的一半。
- 再次遍历数组,计算候选元素的实际出现次数,然后确认它是否满足出现次数超过数组长度的一半的条件。
所以此题Swift 算法解法如下:
func majorityElement(_ nums: [Int]) -> Int {
if nums.count < 2 {
return nums[0]
}
var count = 1
var element = nums[0]
for i in 1 ..< nums.count {
if count == 0 {
element = nums[i]
}
if element == nums[i] {
count += 1
} else {
count -= 1
}
}
return element
}