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 }