數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。
你可以假設數組是非空的,並且給定的數組總是存在多數元素。
本題常見的三種解法:
哈希表統計法: 遍歷數組 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 }