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

2021-06-25 21:41:35 字數 1140 閱讀 7745

題目:陣列中有乙個數字出現的次數超過了陣列長度的一半,找出這個數字。

解法1:將陣列利用快速排序進行排序,因為陣列中有乙個數字出現的次數超過了陣列長度的一半,則排序以後直接取得最中間的那個數字即可!

時間複雜度為:o(n*logn),因為時間主要花費在快速排序上面了!

public static int find1(int a)

解法2:

我們可以建立乙個雜湊表來消除排序的時間。雜湊表的鍵值(

key)為陣列中的數字,值(

value

)為該數字對應的次數。有了這個輔助的雜湊表之後,我們只需要遍歷陣列中的每個數字,找到它在雜湊表中對應的位置並增加它出現的次數。這種雜湊表的方法在陣列的所有數字都在乙個比較窄的範圍內的時候很有效。

// 根據hash表來計算,將其中的key為數字,值為key出現的次數

public static int find2(int a) else

} setset = map.keyset();

iteratoriterator = set.iterator();

int max = -1;

int index = -1;

while (iterator.hasnext())

} return index;

}

3:前面兩種思路都沒有考慮到題目中陣列的特性:陣列中有個數字出現的次數超過了陣列長度的一半。也就是說,有個數字出現的次數比其他所有數字出現次數的和還要多。因此我們可以考慮在遍歷陣列的時候儲存兩個值:乙個是陣列中的乙個數字,乙個是次數。當我們遍歷到下乙個數字的時候,如果下乙個數字和我們之前儲存的數字相同,則次數加

1。如果下乙個數字和我們之前儲存的數字不同,則次數減

1。如果次數為零,我們需要儲存下乙個數字,並把次數設為

1。由於我們要找的數字出現的次數比其他所有數字出現的次數之和還要多,那麼要找的數字肯定是最後一次把次數設為

1時對應的數字。

public static int find3(int a)  else 

if (count == 0)

} return number;

}

找出陣列中出現次數超過一半的數

分析 最直接的方法,對陣列中所有的數排序,然後再掃瞄一遍,統計各個數出現的次數。如果某個數出現的次數超過一半,則輸出這個數。演算法的時間複雜度是o n log 2n n 如果每次刪除兩個不同的數,那麼,在剩下的數字裡,超過一半的數的個數一樣超過了50 不斷重複這個過程,最後剩下的即 為所求。無需避免...

演算法 找出陣列中出現次數超過一半的數

演算法 找出陣列中出現次數超過一半的數 每當我看到經典的演算法題,就懷念高中,感覺很多演算法題就是高中的題目,誰叫哥唯讀了個專科,高數基本相當沒學。有空要看看高數啊,想當年數學那是相當的.方法一 第乙個想到的方法是見乙個二維陣列,一維存陣列中的資料,二維存這個數出現的次數。出現次數最多的那個數就是要...

演算法 找出陣列中出現次數超過一半的數

演算法 找出陣列中出現次數超過一半的數 每當我看到經典的演算法題,就懷念高中,感覺很多演算法題就是高中的題目,誰叫哥唯讀了個專科,高數基本相當沒學。有空要看看高數啊,想當年數學那是相當的.include using namespace std class findtheone int b 2 new...