隐含了一个线索:所有出现超过 ⌊ n/3 ⌋ 次的元素个数最多有 2 个
在不考虑时间和空间复杂度的情况下,两次循环就能得出结果
// 时间复杂度:O(n),其中 n 为数组的长度。
// 空间复杂度:O(n),其中 n 为数组的长度,使用哈希表需要开辟额外的空间。
func majorityElement(nums []int) (ans []int) {
length := len(nums)
need := length / 3
cnt := map[int]int{}
for _, v := range nums {
cnt[v]++
}
for v, c := range cnt {
if c > need {
ans = append(ans, v)
}
}
return
}
func majorityElement(nums []int) (ans []int) {
element1, element2 := 0, 0
vote1, vote2 := 0, 0
for _, num := range nums {
if vote1 > 0 && num == element1 { // 如果该元素为第一个元素,则计数加1
vote1++
} else if vote2 > 0 && num == element2 { // 如果该元素为第二个元素,则计数加1
vote2++
} else if vote1 == 0 { // 选择第一个元素
element1 = num
vote1++
} else if vote2 == 0 { // 选择第二个元素
element2 = num
vote2++
} else { // 如果三个元素均不相同,则相互抵消1次
vote1--
vote2--
}
}
cnt1, cnt2 := 0, 0
for _, num := range nums {
if vote1 > 0 && num == element1 {
cnt1++
}
if vote2 > 0 && num == element2 {
cnt2++
}
}
// 检测元素出现的次数是否满足要求
if vote1 > 0 && cnt1 > len(nums)/3 {
ans = append(ans, element1)
}
if vote2 > 0 && cnt2 > len(nums)/3 {
ans = append(ans, element2)
}
return
}