【力扣150&Golang】多数元素

题目:多数元素

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:

输入: nums = [3,2,3]
输出: 3

示例 2:

输入: nums = [2,2,1,1,1,2,2]
输出: 2

解题思路

1. 常规解法

        可以使用一个 哈希表 来记录每个元素出现的次数,然后再遍历哈希表,找到出现次数超过 ⌊n / 2⌋ 的元素。
空间复杂度:O(n)
时间复杂度:O(n)

代码实现

func majorityElement(nums []int) int {
    
    
    // 创建一个哈希表来记录每个元素的出现次数
    counts := make(map[int]int)
    
    // 统计每个元素出现的次数
    for _, num := range nums {
    
    
        counts[num]++
        
        // 如果某个元素出现次数超过 n/2,立即返回该元素
        if counts[num] > len(nums)/2 {
    
    
            return num
        }
    }
}

2. Boyer-Moore投票算法

        因为多数元素的数量比其他所有元素的总和还多。所以可以通过 投票抵消 的方式,最终留下的就是多数元素。

算法步骤:

  1. 从第一个元素开始,把它当做 候选人,认为它可能是多数元素。
  2. 用一个计数器来记录 候选人 的得票数。如果遇到 候选人 的支持者(即相同的元素),票数加一;如果遇到反对者(不同的元素),票数减一。
  3. 当票数减到零时,说明当前候选人得不到足够的支持,我们就换掉候选人,选当前遇到的下一个元素为新候选人,继续计票。
  4. 因为多数元素的数量超过数组长度的一半,它不会被完全抵消掉,所以最终留下的候选人就是多数元素。

空间复杂度:O(1)
时间复杂度:O(n)

代码实现

func majorityElement(nums []int) int {
    
    
    candidate := 0
    count := 0
    
    for _, num := range nums {
    
    
        // 如果计数器为 0,更新候选人
        if count == 0 {
    
    
            candidate = num
        }
        // 根据当前元素与候选人的关系调整计数器
        if num == candidate {
    
    
            count++
        } else {
    
    
            count--
        }
    }
    
    // 最终 candidate 是多数元素
    return candidate
}

猜你喜欢

转载自blog.csdn.net/qq_42638506/article/details/142712029