java 找到陣列中出現次數超過陣列長度一半的那個數字
阿新 • • 發佈:2019-02-13
/** * 陣列中有一個數字出現的次數超過陣列長度的一半,請找出這個數字。 * 例如輸入一個長度為9的陣列{1,2,3,2,2,2,5,4,2}。 * 由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。 */ public int findMoreThanHalfNum(int[] numbers) { int length = numbers.length; if (length == 0) return 0; int num = numbers[0], count = 1; for (int i = 1; i < length; i++) { if (numbers[i] == num) count++; else count--; if (count == 0) { num = numbers[i]; count = 1; } } // Verifying count = 0; for (int i = 0; i < length; i++) { if (numbers[i] == num) count++; } if (count * 2 > length) return num; return 0; }
這個演算法我已開始想到的是用hashmap來做,以數字為key,value是重複的次數,最後找出重複次數最多的那個,與lenght/2對比一下,應該是可以做出來。但是看了別人的演算法,覺得非常好。上面的程式碼,思路很好,類似於‘士兵攻打陣地’。我們把陣列想象為一群士兵,這些士兵來自不同陣營,士兵們一個一個走出軍營去攻打陣地,第一個兵佔領陣地以後,後面來的兵可能是自己人,也可能不是自己人,是自己人的話,count+1,不是自己人的話,同歸於盡,最後肯定剩下一個人活到最後,但是這個人並不一定屬於人最多的那一個陣營。比如:'3,3,3,1,2,0',第一個3先上去,第二個3再上去,第三個3再上去,這時候count=3,後面1上去,3-1=2,2上去,2-1=1,1上去,1-1=0,這時候留在最後的是0,但是0顯然不是人數最多那個陣營的兵,人數最多的那個陣營都被別的陣營消耗掉了。如果出場順序變為:'3,1,3,3,2,0',那最後留下的人就是3,但是3個3並沒有> (6/2)。如果3的數量再多一個,那麼不論怎麼出場,最後剩下的就是3,畢竟人多,與一半的人同歸於盡後總會剩下人的,這時候顯然4個3>(7/2)。