1234567891011121314151617181920212223242526272829303132333435 |
- func majorityElement(nums []int) (ans []int) {
- n1, n2, c1, c2 := 0, 0, 0, 0
- for _, n := range nums { // At most 2 majority elements occur more than n/3 times.
- // Use two counters to vote the occurence of the numbers.
- switch {
- case n == n1:
- c1++
- case n == n2:
- c2++
- case c1 == 0:
- n1, c1 = n, 1
- case c2 == 0:
- n2, c2 = n, 1
- default:
- c1, c2 = c1-1, c2-1
- }
- }
- c1, c2 = 0, 0
- for _, n := range nums {
- switch n {
- case n1:
- c1++
- case n2:
- c2++
- }
- }
- if len(nums)/3 < c1 {
- ans = append(ans, n1)
- }
- if len(nums)/3 < c2 {
- ans = append(ans, n2)
- }
- return
- }
|