数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
本题常见的三种解法:
哈希表统计法: 遍历数组 nums ,用 HashMap 统计各数字的数量,即可找出 众数 。此方法时间和空间复杂度均为 O(N)O(N) 。
数组排序法: 将数组 nums 排序,数组中点的元素 一定为众数。
摩尔投票法: 核心理念为 票数正负抵消 。此方法时间和空间复杂度分别为 O(N)O(N) 和 O(1)O(1) ,为本题的最佳解法。
func check(nums []int, val int) bool { sz := 0 for _, v := range nums { if v == val { sz++ } } if sz > len(nums) / 2 { return true } return false } func MoreThanHalfNum_Solution(nums []int) int { vote := 0 x := nums[0] for _, num := range nums { // 票数抵消 if vote == 0 { // 假设当前数为众数 x = num } if num == x { // 投正票 vote += 1 } else { // 投反票 vote -= 1 } } if check(nums, x) { return x } return 0 }