java 找到數組中出現次數超過數組長度一半的那個數字

    /**
     * 數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。
     * 例如輸入一個長度爲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)。



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