數(shù)組中出現(xiàn)次數(shù)超過一半的數(shù)字

首先我想到的是建一個(gè)hash表,存放每個(gè)數(shù)字對(duì)應(yīng)的次數(shù);但是題目沒有給定數(shù)組的大小,這樣做可能無(wú)限大;
然后先到可以對(duì)數(shù)組排序,這樣遍歷一次就可以了;但時(shí)間復(fù)雜度為O(nlog(n))

這里我們的思路是,遍歷數(shù)組,記錄一個(gè)數(shù)字和次數(shù)times;遇到相同的數(shù)字則次數(shù)加一,遇到不同的數(shù)字則減一;如果次數(shù)變?yōu)?,則數(shù)字更新為當(dāng)前的數(shù)字,并把次數(shù)置1;如此遍歷之后,因?yàn)槲覀円獙ふ业臄?shù)字次數(shù)超過總數(shù)字一半,最后有一個(gè)數(shù)字的次數(shù)不為0,得到的就是我們要找到的數(shù)字??梢宰约号e例子體會(huì)一下。
這一段代碼如下:

    int ret = arr[0];
    int n = 1;
    for (int i =1 ; i < len; i++)
    {
        if (n == 0)
        {
            ret = arr[i];
            n = 1;
        }
        else if (arr[i] == ret)
            n++;
        else
            n--;

    }

為了增加程度對(duì)錯(cuò)誤輸入的處理能力,加入了幾行判斷的語(yǔ)句:

bool inputInvalid = false;
int findNUmber(int* arr,int len)
{
    int ret = arr[0];
    int n = 1;
    if (!arr || len == 0)
    {
        inputInvalid = true;
        return 0;
    }
    for (int i =1 ; i < len; i++)
    {
        if (n == 0)
        {
            ret = arr[i];
            n = 1;
        }
        else if (arr[i] == ret)
            n++;
        else
            n--;

    }
    //check if input valid
    n = 0;
    for (int i = 0; i < len; i++)
    {
        if (arr[i] == ret)
            n++;
    }
    if (n * 2 < len)
        inputInvalid = true;

    if (!inputInvalid)
        return ret;
    else
        return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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