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
}

 

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