1. 程式人生 > 其它 >39. 陣列中出現次數超過一半的數字

39. 陣列中出現次數超過一半的數字

技術標籤:leetcode劍指offer

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

你可以假設陣列是非空的,並且給定的陣列總是存在多數元素。在這裡插入圖片描述
解題思路:

本文將 “陣列中出現次數超過一半的數字” 簡稱為 “眾數” 。 需要注意的是,數學中眾數的定義為 “陣列中出現次數最多的數字”
,與本文定義不同。

本題常見的三種解法:

  1. 雜湊表統計法: 遍歷陣列 nums ,用 HashMap 統計各數字的數量,即可找出 眾數 。此方法時間和空間複雜度均為 O(N)。
  2. 陣列排序法: 將陣列 nums 排序,陣列中點的元素 一定為眾數。
  3. 摩爾投票法: 核心理念為 票數正負抵消 。此方法時間和空間複雜度分別為 O(N) 和 O(1) ,為本題的最佳解法。

摩爾投票法: 設輸入陣列 nums 的眾數為 x,陣列長度為 n 。

推論一: 若記 眾數 的票數為 +1+1 ,非眾數 的票數為 -1−1 ,則一定有所有數字的 票數和 > 0>0 。

推論二: 若陣列的前 aa 個數字的 票數和 = 0=0 ,則 陣列剩餘 (n-a)(n−a) 個數字的 票數和一定仍 >0>0 ,即後 (n-a)(n−a) 個數字的 眾數仍為 xx 。

class Solution {
    public int majorityElement(int[] nums) {
        int x = 0, votes = 0;
        for(
int num : nums){ if(votes == 0) x = num; votes += num == x ? 1 : -1;//等價於votes = votes + ( num == x ? 1 : -1); } return x; } }