思路一:
用一个 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。
- 遍历:遍历数组中的每一个元素。
-
- 如果计数器为0,选择当前元素为新的候选元素,并将计数器重置为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
}