【力扣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
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值