經(jīng)典面試題16 - 數(shù)組中出現(xiàn)次數(shù)超過一半的數(shù)字

問題
數(shù)組中有一個(gè)數(shù)字出現(xiàn)的次數(shù)超過數(shù)組長(zhǎng)度的一半,請(qǐng)找出這個(gè)數(shù)字捞高。

例如: 輸入一個(gè)長(zhǎng)度為7的數(shù)組,

{1,2,2,2,5,4,2}

由于數(shù)字2在數(shù)組中出現(xiàn)了4次氯材,超過數(shù)組長(zhǎng)度的一半渣锦,因此輸出2。如果不存在則輸出0氢哮。

解答

首先說這是一道很經(jīng)典的面試題袋毙,很多互聯(lián)網(wǎng)公司都曾經(jīng)采用過這個(gè)題目。

下面是對(duì)該題的分析思路:

  • 如果沒有時(shí)間復(fù)雜度的要求冗尤, 我們可以對(duì)數(shù)組進(jìn)行排序听盖,排序后的數(shù)組,那么我們只要遍歷一次就可以統(tǒng)計(jì)出每個(gè)數(shù)字出現(xiàn)的次數(shù)裂七,這樣也就能找出符合要求的數(shù)字皆看。按照這個(gè)思路的時(shí)間復(fù)雜度是O(nlogn), 其中排序的時(shí)間復(fù)雜度是O(nlogn)背零,遍歷的時(shí)間復(fù)雜度O(n)腰吟。

  • 另一個(gè)思路是我們可以創(chuàng)建一個(gè)哈希表來消除排序的時(shí)間步悠。哈希表的鍵值為數(shù)組中的數(shù)字辅肾,值為該數(shù)字對(duì)應(yīng)的次數(shù)翩活。有了這個(gè)哈希表之后恳邀,我們只需要遍歷數(shù)組中的每個(gè)數(shù)字敲长,找到它在哈希表中對(duì)應(yīng)的位置并增加它出現(xiàn)的次數(shù)塌碌。這種哈希表的方法在數(shù)組的所有數(shù)字都在一個(gè)比較窄的范圍內(nèi)的時(shí)候很有效惋耙。

  • 最佳思路:數(shù)組中有一個(gè)數(shù)字出現(xiàn)的次數(shù)超過數(shù)組長(zhǎng)度的一半措近,也就是說它出現(xiàn)的次數(shù)比其他所有數(shù)字出現(xiàn)次數(shù)的和還要多虽缕。
    因此我們可以考慮在遍歷數(shù)組的時(shí)候保存兩個(gè)值:一個(gè)是數(shù)組中的一個(gè)數(shù)字始藕,一個(gè)是次數(shù)。當(dāng)我們遍歷到下一個(gè)數(shù)字的時(shí)候氮趋,如果下一個(gè)數(shù)字和我們之前保存的數(shù)字相同伍派,則次數(shù)加1;如果下一個(gè)數(shù)字和我們之前保存的數(shù)字不同剩胁,則次數(shù)減1诉植。
    如果次數(shù)為0,我們需要保存下一個(gè)數(shù)字昵观,并把次數(shù)置1晾腔。因?yàn)榇螖?shù)為0,表示前面是字符串計(jì)數(shù)抵消為0啊犬。

//Java源碼
public int MoreThanHalfNum_Solution(int [] numbers) {
        int maxNum = 0;
        if(numbers.length==0)
            return maxNum;
        maxNum = numbers[0];
        int numCount = 1;
        for(int i=1;i<numbers.length-1;i++){
            if(numbers[i] == maxNum){
                numCount++;
            }else{
                numCount--;
                if(numCount == 0){
                    numCount = 1;
                    maxNum = numbers[i];
                }
            }
        }
        int total = 0;  
        for (int i = 0; i < numbers.length; i++) {  
            if (numbers[i] == maxNum) total++;  
        }  
        if (total * 2 <= numbers.length) {  
            return 0;
        }  
        else return maxNum ;
    }

上述源碼可以在 這里 調(diào)試

推薦閱讀

經(jīng)典面試100題 - 持續(xù)更新中

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末灼擂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子觉至,更是在濱河造成了極大的恐慌剔应,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異峻贮,居然都是意外死亡席怪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門纤控,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挂捻,“玉大人,你說我怎么就攤上這事船万∠覆悖” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵唬涧,是天一觀的道長(zhǎng)疫赎。 經(jīng)常有香客問我,道長(zhǎng)碎节,這世上最難降的妖魔是什么捧搞? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮狮荔,結(jié)果婚禮上胎撇,老公的妹妹穿的比我還像新娘。我一直安慰自己殖氏,他們只是感情好晚树,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著雅采,像睡著了一般爵憎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上婚瓜,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天宝鼓,我揣著相機(jī)與錄音,去河邊找鬼巴刻。 笑死愚铡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的胡陪。 我是一名探鬼主播沥寥,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼柠座!你這毒婦竟也來了邑雅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤愚隧,失蹤者是張志新(化名)和其女友劉穎蒂阱,沒想到半個(gè)月后锻全,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狂塘,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡录煤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了荞胡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妈踊。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖泪漂,靈堂內(nèi)的尸體忽然破棺而出廊营,到底是詐尸還是另有隱情,我是刑警寧澤萝勤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布露筒,位于F島的核電站,受9級(jí)特大地震影響敌卓,放射性物質(zhì)發(fā)生泄漏慎式。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一趟径、第九天 我趴在偏房一處隱蔽的房頂上張望瘪吏。 院中可真熱鬧,春花似錦蜗巧、人聲如沸掌眠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蓝丙。三九已至,卻和暖如春望拖,著一層夾襖步出監(jiān)牢的瞬間迅腔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工靠娱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沧烈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓像云,卻偏偏與公主長(zhǎng)得像锌雀,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子迅诬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • 該文章總結(jié)自牛課網(wǎng)的在線算法課程(https://www.nowcoder.com/) 經(jīng)典排序算法就是前面講那幾...
    鍋與盆閱讀 7,681評(píng)論 6 14
  • 作者:July腋逆、wuliming、pkuoliver 說明:本文分為三部分內(nèi)容侈贷,第一部分為一道百度面試題Top K...
    cyj_ya閱讀 800評(píng)論 0 0
  • 第一章 緒論 什么是數(shù)據(jù)結(jié)構(gòu)惩歉? 數(shù)據(jù)結(jié)構(gòu)的定義:數(shù)據(jù)結(jié)構(gòu)是相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。 第二章...
    SeanCheney閱讀 5,744評(píng)論 0 19
  • 所有貨幣都需要一些方法來控制供應(yīng),并強(qiáng)制執(zhí)行各種安全屬性以防止作弊撑蚌。在法定貨幣方面上遥,像中央銀行這樣的組織控制貨幣供...
    Nutbox_Lab閱讀 3,076評(píng)論 1 3
  • 題目:數(shù)組中有一個(gè)數(shù)字出現(xiàn)的次數(shù)超過數(shù)組長(zhǎng)度的一半,請(qǐng)找出這個(gè)數(shù)字争涌。 解法:假設(shè)將數(shù)組排序粉楚,因?yàn)樗髷?shù)字出現(xiàn)次數(shù)超...
    qmss閱讀 393評(píng)論 0 0