劍指 Offer —數組中出現次數超過一半的數字

復仇Bytedance之路

題目描述:

數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。

你可以假設數組是非空的,並且給定的數組總是存在多數元素。

示例 1:

輸入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
輸出: 2

限制:

1 <= 數組長度 <= 50000

題解

摩爾投票法:

  • 票數和: 由於衆數出現的次數超過數組長度的一半;若記 衆數 的票數爲 +1,非衆數 的票數爲 -1 ,則一定有所有數字的 票數和 > 0 。
  • 票數正負抵消: 設數組 nums 中的衆數爲 x ,數組長度爲 n 。若 nums 的前 a 個數字的 票數和 = 0 ,則 數組後 (n-a)個數字的 票數和一定仍 >0 (即後 (n-a) 個數字的 衆數仍爲 x )。

在這裏插入圖片描述

class Solution {
    public int majorityElement(int[] nums) {
        //摩爾投票法
        int res=0;
        //票數
        int votes=0;
        for(int num :nums){
        	//vote爲0的話,說明在此之前都互相抵消了。創建新的res
			if(votes==0){
				res=num;
			}
			//當前數字等於目前的衆數嗎?
			//等於則票數+1,否則-1
			votes+= num==res?1:-1;
		}
		return res;
    }
}

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