JZ28 数组中出现次数超过一半的数字

数组中出现次数超过一半的数字

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

 

本题常见的三种解法:

哈希表统计法: 遍历数组 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
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章