多数元素

12 阅读1分钟

思路一:

用一个 map 记录每个元素及出现次数,取最多的

func majorityElement(nums []int) int {
	myMap := make(map[int]int)
	for _, item := range nums {
		if _, ok := myMap[item]; ok {
			myMap[item]++
		} else {
			myMap[item] = 1
		}
	}
	//找到出现次数最多的
	maxKey := 0
	maxValue := 0
	for key, value := range myMap {
		if value>maxValue{
			maxValue=value
			maxKey=key
		}
	}
	return maxKey
}

思路二:

基于题目的特定条件,可以提前终止,发现出现次数>n/2 则返回

func majorityElement(nums []int) int {
	myMap := make(map[int]int)
	lenth:=len(nums)
	for _, item := range nums {
		if _, ok := myMap[item]; ok {
			myMap[item]++
		} else {
			myMap[item] = 1
		}
		if myMap[item] > lenth/2 {
			return item
		}
	}
	return -1
}

思路三:摩尔投票算法

  1. 初始化:选取第一个元素作为多数元素候选,设置计数器为1。
  2. 遍历:遍历数组中的每一个元素。
    • 如果计数器为0,选择当前元素为新的候选元素,并将计数器重置为1。
    • 如果遇到的元素等于候选元素,计数器加1;否则,计数器减1。
  1. 返回候选元素:由于多数元素的定义是出现次数大于 n/2,这保证了最后候选元素的正确性。

这个算法的时间复杂度是O(n),空间复杂度是O(1),非常高效。

func majorityElement(nums []int) int {
    candidate := nums[0]
    count := 1
    for i := 1; i < len(nums); i++ {
        if count == 0 {
            // 更换候选人
            candidate = nums[i]
            count = 1
        } else if candidate == nums[i] {
            // 候选人得到支持
            count++
        } else {
            // 候选人遇到反对
            count--
        }
    }
    return candidate
}