题目:
给定一个大小为 n **的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
解法:
方法一:分治法
func majorityElement(nums []int) int {
return majorityElementCore(nums, 0, len(nums) - 1)
}
func majorityElementCore(nums []int, left, right int) int{
if left == right {
return nums[left]
}
mid := (right + left) / 2
leftMajorElem := majorityElementCore(nums, left, mid)
rightMajorElem := majorityElementCore(nums, mid + 1, right)
if leftMajorElem == rightMajorElem {
return leftMajorElem
}
leftMajorCount := getElemCount(nums, left, right, leftMajorElem)
rightMajorCount := getElemCount(nums, left, right, rightMajorElem)
if leftMajorCount > rightMajorCount {
return leftMajorElem
}
return rightMajorElem
}
func getElemCount(nums []int, left, right int, elem int) int {
count := 0
for left <= right {
if nums[left] == elem {
count ++
}
left ++
}
return count
}
方法二:
投票法,投票数为0时,设置自己为候选人,候选数字和自己相同时投票赞成票。voteNum ++,不同时投反对票voteNum --,最后剩下的候选人就是多数人。
func majorityElement(nums []int) int {
candidate := 0
voteNum := 0
for i := 0; i < len(nums); i ++ {
if voteNum == 0 {
candidate = nums[i]
}
if candidate == nums[i]{
voteNum ++
} else {
voteNum --
}
}
return candidate
}