LintCode 399 [Nuts & Bolts Problem]

原題

給定一組 n 個(gè)不同大小的 nuts 和 n 個(gè)不同大小的 bolts。nuts 和 bolts 一一匹配。 不允許將 nut 之間互相比較,也不允許將 bolt 之間互相比較。也就是說(shuō),只許將 nut 與 bolt 進(jìn)行比較, 或?qū)?bolt 與 nut 進(jìn)行比較。請(qǐng)比較 nut 與 bolt 的大小。

樣例
Nuts 用一個(gè)string數(shù)組表示 nuts [] = ['ab','bc','dd','gg']. Bolts 也用一個(gè)string數(shù)組表示 bolts[] = ['AB','GG', 'DD', 'BC']. 我們將提供一個(gè)比較函數(shù),以比較 nut 與 bolt 的大小。將 nuts 進(jìn)行升序排序,使得 nuts 與 bolts 位置對(duì)等。
比如 nuts = ['ab','bc','dd','gg'], bolts = ['BC','AA','DD','GG']

解題思路

  • Selection Sort - 利用partition的思想
    因?yàn)镹uts之間,Bolts之間都是不能相互比較的,所以思路就是隨機(jī)選擇一個(gè)Nut來(lái)partition Bolts然后再反過(guò)來(lái)用那個(gè)已經(jīng)在正確位置的Bolt來(lái)partition Nuts
  • 初始:cc aa dd bb
  • 隨機(jī)找到BB,partition之后
  • aa bb cc dd (cc, dd的順序不確定)
  • 之后再拿bb去反過(guò)來(lái)partition,得到
  • AA BB DD CC
  • 遞歸向下,分別左右sort
  • 注意比較的時(shí)候compare函數(shù)只能
  • partition函數(shù)的執(zhí)行過(guò)程,模擬
pivot是4,通過(guò)for循環(huán)找到,交換到第一位,并記住pivot_partner = 4
開(kāi)始:[4, 3, 2, 9, 5]
5 > 4: [5, 3, 2, 9, 5]
3 < 4: [5, 3, 2, 9, 3]
9 > 4: [5, 9, 2, 9 , 3]
2 < 4: [5, 9, 2, 2, 3]
此時(shí)L在二號(hào)位,讓nums[L] = pivot_partner
[5, 9, 4, 2, 3] =>保證了4前面都是大于4的,后面都是小于4的

完整代碼

# class Comparator:
#     def cmp(self, a, b)
# You can use Compare.cmp(a, b) to compare nuts "a" and bolts "b",
# if "a" is bigger than "b", it will return 1, else if they are equal,
# it will return 0, else if "a" is smaller than "b", it will return -1.
# When "a" is not a nut or "b" is not a bolt, it will return 2, which is not valid.
class Solution:
    # @param nuts: a list of integers
    # @param bolts: a list of integers
    # @param compare: a instance of Comparator
    # @return: nothing
    def sortNutsAndBolts(self, nuts, bolts, compare):
        # write your code here
        if nuts == [] or bolts == [] or compare is None:
            return 
        self.compare = compare
        self.quickSort(nuts, bolts, 0, len(nuts) - 1)
        
    def quickSort(self, nuts, bolts, left, right):
        if left >= right:
            return 
        split_nut_pos = self.partition(nuts, bolts[left], left, right)
        split_bolt_pos = self.partition(bolts, nuts[split_nut_pos], left, right)
        self.quickSort(nuts, bolts, left, split_nut_pos - 1)
        self.quickSort(nuts, bolts, split_nut_pos + 1, right)
        
    def partition(self, items, pivot, left, right):
        if items == [] or pivot == None:
            return
        
        # 首先把pivot換到數(shù)組的第一個(gè)位置
        for i in range(left, right + 1):
            if self.compare.cmp(pivot, items[i]) == 0 \
                or self.compare.cmp(items[i], pivot) == 0:
                items[left], items[i] = items[i], items[left]
                break
        
        # 如果pivot是AA,此時(shí)pivot_partner就是aa
        pivot_partner = items[left]
        while left < right:
            while left < right and \
                (self.compare.cmp(pivot, items[right]) == -1 \
                or self.compare.cmp(items[right], pivot) == 1):
                right -= 1
            items[left] = items[right]
            
            while left < right and \
                (self.compare.cmp(pivot, items[left]) == 1 \
                or self.compare.cmp(items[left], pivot) == -1):
                left += 1
            items[right] = items[left]
            
        items[left] = pivot_partner
        return left
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,818評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,185評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 175,656評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,647評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,446評(píng)論 6 405
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 54,951評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,041評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,189評(píng)論 0 287
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,718評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,602評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,800評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,045評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,419評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,671評(píng)論 1 281
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,420評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,755評(píng)論 2 371

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

  • 創(chuàng)建全文索引 - 全文索引 ``` > use imooc switched to db imooc > db.i...
    威研威語(yǔ)閱讀 295評(píng)論 0 0
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問(wèn)題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,761評(píng)論 0 33
  • by:孤鳥(niǎo)差魚(yú) 發(fā)黃的紙張 沾灰的照片 斷墨的鋼筆 與一個(gè)叫過(guò)去的東西 據(jù)說(shuō)是遠(yuǎn)房表親
    孤鳥(niǎo)差魚(yú)閱讀 361評(píng)論 0 1
  • 陳籬知道阿蠐離開(kāi)的消息,是在公主的宴會(huì)上,笙歌婉轉(zhuǎn),簫琴悠然,觥籌交錯(cuò),十分熱鬧。 握著那張紙條,陳籬突然覺(jué)得世界...
    李離閱讀 375評(píng)論 7 3