陣列中有乙個數字出現的次數超過了陣列長度的一半,找出這個數字。
1.如果
無序,那麼我們是不是可以先把陣列中所有這些數字
先進行排序
,至於選取什麼排序方法則不在話下,最常用的快速排序o(
n*logn
)即可。排完序呢,直接遍歷。在遍歷整個陣列的同時統計每個數字的出現次數,然後把那個出現次數超過一半的數字直接輸出,題目便解答完成了。總的時間複雜度為o(
n*logn+n
)。我們發現,乙個數字在陣列中的出現次數超過了一半,那麼在
已排好序的陣列索引的
n/2處
(從零開始編號),就一定是這個數字。自此,我們只需要對整個陣列排完序之後,然後直接輸出陣列中的第
n/2處的數字即可,這個數字即是整個陣列中出現次數超過一半的數字,總的時間複雜度由於少了最後一次整個陣列的遍歷,縮小到o(
n*logn)。
2.要縮小總的時間複雜度,那麼就用查詢時間複雜度為o(
1),事先預處理時間複雜度為o(
n)的hash表。雜湊表的鍵值(
key)為陣列中的數字,值(
value
)為該數字對應的次數。然後直接遍歷整個
hash
表,找出每乙個數字在對應的位置處出現的次數,輸出那個出現次數超過一半的數字即可。hash
表需要o(n
)的開銷空間,且要設計
hash
函式。3.
如果每次刪除兩個不同的數
(不管是不是我們要查詢的那個出現次數超過一半的數字),那麼,在剩下的數中,我們要查詢的數(出現次數超過一半)出現的次數仍然超過總數的一半。通過不斷重複這個過程,不斷排除掉其它的數,最終找到那個出現次數超過一半的數字。這個方法,免去了上述思路
一、二的排序,也避免了思路三空間o(n
)的開銷,總得說來,時間複雜度只有o(
n),空間複雜度為o(
1),不失為最佳方法。
關於加強版水王的題我有個想法可以掃瞄一遍陣列就解決問題:
首先,水王佔總數的一半,說明總數必為偶數;其次,最後乙個元素或者是水王,或者不是水王,因此只要在掃瞄陣列的時候每乙個元素都與最後乙個元素做比較,如果相等則最後乙個元素的個數加1,否則不處理。如果最後乙個元素的個數為n/2,(n為陣列元素個數)則它就是水王,否則水王就是前面n-1個元素中選出的candidate。
陣列中超過出現次數超過一半的數字
題目 陣列中有乙個陣列出現的次數超過了陣列長度的一半,找出這個數字。答 include stdafx.h include using namespace std 查詢陣列中超過出現次數超過一半的數字 int findnumber int arr,int length int nvalue arr 0...
陣列中出現超過一半的次數
題目 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0.思路一 把陣列排好序,出現次數超過一半的數一定是排好序陣列的中位數。然後取中位數,計算它出現的次數是否超過陣列長度的一半。...
出現次數超過一半的數字
題目 陣列中有乙個數字出現的次數超過了陣列長度的一半,找出這個數字。乙個陣列中有很多數,現在我們要找出其中那個出現次數超過總數一半的數字,怎麼找呢?大凡當我們碰到某乙個雜亂無序的東西時,我們人的內心本質期望是希望把它梳理成有序的。所以,我們得分兩種情況來討論,無序和有序。如果無序,那麼我們是不是可以...