169. 多数元素

135 阅读1分钟

题目:
给定一个大小为 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
}