劍指offer 第二十八題 數組中出現次數超過一半的數字

題目描述

數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度爲9的數組{1,2,3,2,2,2,5,4,2}。由於數字2在數組中出現了5次,超過數組長度的一半,因此輸出2。如果不存在則輸出0。

思路:

       一個數字,如果在數組中出現了超過1/2len的次數,那麼遍歷一遍就可以知道這個數字是什麼。

      我們只要做 比較 就可以了

      從一開始,我們就做比較,如果相同的話,count ++ 如果不同的話 count--,當count減到0的時候,就將number更換成當前的數字。

      這樣是否可以呢?簡單思考一下,如果目標數字 剛和其他數字抵消的話,那麼最後數字就是  len (目標數字數目) -(len(all) - len( all -目標數字數目)),如果其他數字相互抵消的話,這樣更好,這樣最後剩下的count 更多,抵消一對的話+2;

     如下圖:第一個圖中,每一個2剛和其他的數字抵消,這樣正好留一下一個,而第二個圖中,一開始1和3抵消了,這樣比第一個圖多留了2個

解答:

public class Solution {
    public int MoreThanHalfNum_Solution(int [] array) {
        int number =0;
        int count =0;
        for(int i=0;i<array.length;i++){
            if(count ==0){
                number = array[i];
                count++;
                continue;
            }else {
                if(array[i] == number){
                    count++;
                }else {
                    count--;
                    if(count ==0)
                        number=0;
                }
            }

        }
        if(number ==0)
            return 0;
        else {
            int len =0;
            for(int i=0;i<array.length;i++)
                if(number == array[i])
                    len++;
            if(len >array.length/2)
                return number;
            else
                return 0;
        }
    }
}

 

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