劍指offer--28.數(shù)組中出現(xiàn)次數(shù)超過一半的數(shù)字

題目:
數(shù)組中有一個數(shù)字出現(xiàn)的次數(shù)超過數(shù)組長度的一半,請找出這個數(shù)字。例如輸入一個長度為9的數(shù)組{1,2,3,2,2,2,5,4,2}。由于數(shù)字2在數(shù)組中出現(xiàn)了5次,超過數(shù)組長度的一半,因此輸出2。如果不存在則輸出0。

思路:
思路1: 可以做排序,如數(shù)組符合條件,處于中間的那個數(shù)必定是所求數(shù),然后統(tǒng)計出現(xiàn)個數(shù),判斷是否符合題意。因快排時間復雜度O(nlogn),并非最優(yōu)
思路2:如果有符合條件的數(shù)字,則它出現(xiàn)的次數(shù)比其他所有數(shù)字出現(xiàn)的次數(shù)和還要多。
在遍歷數(shù)組時保存兩個值:一是數(shù)組中的一個數(shù)字,一個是次數(shù)。遍歷下一個數(shù)字時,若它與之前保存的數(shù)字相同,則次數(shù)加1,否則次數(shù)減1;若次數(shù)為0,則保存下一個數(shù)字,并將次數(shù)置為1。遍歷結束后,所保存的數(shù)字即為所求。然后再判斷它是否符合條件即可。

public class Solution {
    public int MoreThanHalfNum_Solution(int [] array) {
        int length = array.length;
        if(array == null || length <= 0){
            return 0;
        }
        
        int result = array[0];
        int count = 1;
        for(int i =  1;i < length; i++){
            if(count == 0){
                result = array[i];
                count = 1;
            }else{
                if(array[i] == result){
                    count++;
                }else{
                    count--;
                }
            }
        }
        
        int times=0;
        for(int i = 0;i < length; i++){
            if(result == array[i]){
                times++;
            }
        }
            
       if(times*2 <= length){
           result = 0;
       }
       return result;
    }
}
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容