169. 多数元素

题目描述

思路
我们分别使用「排序法」和「投票法」两种思路来解决这道题。
「排序法」很有意思,我们对数组排序之后,会出现一个性质,那就是中位数一定是众数,前提是 这个众数在数组当中出现过的此时大于半数。因此对数组排序之后直接返回中位数就是正确的答案,但该方法最优的时间复杂度仍然排序的时间复杂度O(nlogn)O(n\log{n})O(nlogn)。
「投票法」可以通过一次遍历得到答案,且空间复杂度为常数。具体来说,我们不需要对数组进行排序,我们只需要维护两个变量,分别是candidate和cnt。candidate就是候选的众数,而cnt是当前候选者的票数。我们初始时令candidate := nums[0],之后开始遍历[1, n)。如果nums[i] == candidate,那么就为当前候选者投票,即cnt += 1,否则cnt -= 1。当该候选者的票数为0的时候,就更换候选者为当前的nums[i]。通过这种方式,最终找到的候选者就是数组当中过半的众数。
Golang 题解
「排序法」
go
func majorityElement(nums []int) int {
sort.Slice(nums, func (i, j int) bool {
return nums[i] < nums[j]
})
return nums[len(nums) / 2]
}
「投票法」
go
func majorityElement(nums []int) int {
n := len(nums)
candidate := nums[0]
cnt := 1
for i := 1; i < n; i ++ {
if nums[i] == candidate {
cnt += 1
} else {
cnt -= 1
if cnt == 0 {
candidate = nums[i]
cnt = 1
}
}
}
return candidate
}