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

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

方法一:基于Partition函數(shù)的O(n)算法
數(shù)組中有一個(gè)數(shù)字出現(xiàn)的次數(shù)超過(guò)了數(shù)組長(zhǎng)度的一半亭姥,那么這個(gè)數(shù)一定是這個(gè)數(shù)組的中位數(shù)三圆。我們需要找到這個(gè)數(shù)組的第n/2大的數(shù)字。所以問(wèn)題轉(zhuǎn)化成找數(shù)組中第k大的數(shù)這樣的問(wèn)題蒜绽。
跟快速排序的Partition函數(shù)一樣,我們隨機(jī)選擇數(shù)組中的一個(gè)數(shù)字桶现,調(diào)整數(shù)組中數(shù)字的順序躲雅,使得比選中數(shù)字小的都在它的左邊,其它的都在它右邊骡和。如果這個(gè)選中的數(shù)字的下標(biāo)剛好是n/2相赁,那么這個(gè)數(shù)字就是數(shù)組中的中位數(shù)。如果它的下標(biāo)大于n/2慰于,那么中位數(shù)應(yīng)該位于它的左邊钮科,如果它的下標(biāo)小于n/2,那么中位數(shù)位于它的右邊婆赠。

方法二:
在遍歷數(shù)組的時(shí)候保存兩個(gè)值:一個(gè)是數(shù)組中的一個(gè)數(shù)字绵脯,一個(gè)是次數(shù)。當(dāng)遍歷下一個(gè)數(shù)字的時(shí)候,如果上一個(gè)數(shù)字和之前保存的數(shù)字相同桨嫁,則次數(shù)加1,如果不同份帐,則次數(shù)減1璃吧。如果次數(shù)為零,則需要保存下一個(gè)數(shù)字废境,并把次數(shù)設(shè)為1畜挨。

下面的Python代碼分別實(shí)現(xiàn)了上面兩種方法:

#encoding=utf8
'''
題目:數(shù)組中有一個(gè)數(shù)字出現(xiàn)的次數(shù)超過(guò)數(shù)組長(zhǎng)度的一半,找出這個(gè)數(shù)字
'''
 
def partition(num_list, start, end):
    '''將num_list從start開(kāi)始噩凹,到end結(jié)束的部分分組巴元,以start位置的數(shù)字為基準(zhǔn),返回基準(zhǔn)最后所在的位置'''
    
    pivot = num_list[start]
    while start < end:
        while start < end and num_list[end] >= pivot:end -= 1
        if start < end:num_list[start] = num_list[end]
        while start < end and num_list[start] <= pivot:start += 1
        if start < end:num_list[end] = num_list[start]
    num_list[start] = pivot
    return start
        
def find_half_num_1(num_list):
    '''返回num_list中間的數(shù)字'''
    
    if type(num_list) != type([]) or len(num_list) == 0:
        return None
    start = 0
    end = len(num_list) - 1
    middle = end / 2
    
    index = partition(num_list, start, end)
    while index != middle:
        if index > middle:
            end = index - 1
            index = partition(num_list, start, end)
        else:
            start = index + 1
            index = partition(num_list, start, end)
            
    return num_list[middle]
 
def find_half_num_2(num_list):
    if type(num_list) != type([]):
        return None
    
    result = None
    time = 0
    for i in range(0, len(num_list)):
        if time == 0:
            result = num_list[i]
            time = 1
        else:
            if num_list[i] == result:
                time += 1
            else:
                time -= 1
    return result
 
if __name__ == '__main__':
    l_1 = [1,2,3,4,5,6,7,8,2,2,2,2,2,2,2,2,2,2,2,2]
    l_2 = []
    l_3 = [1,2,3,4,5,6,7,8,9,9,9,9,9,9,9,9,9,9,9,9]
    l_4 = None
    l_5 = [5]
    print find_half_num_1(l_1)
    print find_half_num_1(l_2)
    print find_half_num_1(l_3)
    print find_half_num_1(l_4)
    print find_half_num_1(l_5)
    print find_half_num_2(l_1)
    print find_half_num_2(l_2)
    print find_half_num_2(l_3)
    print find_half_num_2(l_4)
    print find_half_num_2(l_5)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末驮宴,一起剝皮案震驚了整個(gè)濱河市逮刨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌堵泽,老刑警劉巖修己,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異迎罗,居然都是意外死亡睬愤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)纹安,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)尤辱,“玉大人,你說(shuō)我怎么就攤上這事厢岂」舛剑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵咪笑,是天一觀的道長(zhǎng)可帽。 經(jīng)常有香客問(wèn)我,道長(zhǎng)窗怒,這世上最難降的妖魔是什么映跟? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮扬虚,結(jié)果婚禮上努隙,老公的妹妹穿的比我還像新娘。我一直安慰自己辜昵,他們只是感情好荸镊,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般躬存。 火紅的嫁衣襯著肌膚如雪张惹。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,549評(píng)論 1 312
  • 那天岭洲,我揣著相機(jī)與錄音宛逗,去河邊找鬼。 笑死盾剩,一個(gè)胖子當(dāng)著我的面吹牛雷激,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播告私,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼屎暇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了驻粟?” 一聲冷哼從身側(cè)響起根悼,我...
    開(kāi)封第一講書(shū)人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蜀撑,沒(méi)想到半個(gè)月后番挺,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡屯掖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年玄柏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贴铜。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡粪摘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绍坝,到底是詐尸還是另有隱情徘意,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布轩褐,位于F島的核電站椎咧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏把介。R本人自食惡果不足惜勤讽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拗踢。 院中可真熱鬧脚牍,春花似錦、人聲如沸巢墅。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至驯遇,卻和暖如春芹彬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背叉庐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工雀监, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人眨唬。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像好乐,于是被迫代替她去往敵國(guó)和親匾竿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

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