合并兩個有序數(shù)組(OC與Swift實現(xiàn))

能力有限零渐,水平一般,如果有錯誤,請不吝賜教淌哟。??

給你兩個有序整數(shù)數(shù)組 nums1nums2迹卢,請你將nums2 合并到 nums1 中,使 nums1 成為一個有序數(shù)組徒仓。
初始化nums1nums2 的元素數(shù)量分別為 mn 婶希。你可以假設 nums1 的空間大小等于 m + n,這樣它就有足夠的空間保存來自 nums2 的元素蓬衡。

OC語言實現(xiàn)
方式1:

- (void)merge:(NSArray *)nums1 m:(int)m nums2:(NSArray *)nums2 n:(int)n {
    
    /**
     *  原理數(shù)這樣的:
     *  1喻杈、創(chuàng)建一個大小為m+n的數(shù)組。這樣我們就得到了三個數(shù)組狰晚,source,nums1,nums2,
     *  2筒饰、創(chuàng)建三個下標(指針),分別指向source/nums1/nums2的首元素壁晒。
     *  3瓷们、創(chuàng)建循環(huán),目的是取出nums1/nums2數(shù)組中較小的數(shù)字秒咐,放入新的數(shù)組當中谬晕,
     *      并將對應的下標加1(p++并且(p1++或者p2++)),一直到打破循環(huán)(p1 == m 或者 p2 == n)
     *  4携取、循環(huán)完成后攒钳,必然出現(xiàn)的結果就是:p1 < m 或者 p2 < n,兩種情況必然出現(xiàn)一種雷滋。
     *      p1 < m不撑,nums1中存在較大的元素,因此num1中存在未被添加到source的元素晤斩;
     *      p2 < m焕檬,nums2中存在較大的元素,因此num2中存在未被添加到source的元素澳泵;
     *      我們只需要实愚,直接取出(或者遍歷)loc:p1/p2 length:m-p1/n-p2 的元素即可。
     */
    // 得到最終排序結果的數(shù)組
    NSMutableArray *source = [NSMutableArray arrayWithCapacity:(m+n)];
    
    int p  = 0; // 指向souce數(shù)組的元素的下標
    int p1 = 0; // 指向nums1數(shù)組的元素的下標
    int p2 = 0; // 指向nums2數(shù)組的元素的下標
    
    while (p1 < m && p2 < n) {
        if ([nums1[p1] intValue] <= [nums2[p2] intValue]) {
            // 取出nums1中較小的元素
            source[p] = nums1[p1];
            // nums1下標(指針)自增
            p1++;
        }
        else {
            // 取出nums2中較小的元素
            source[p] = nums2[p2];
            // nums2下標(指針)自增
            p2++;
        }
        // source下標(指針)自增
        p++;
    }
    
    if (p1 < m) { // nums1中剩余元素
        // 直接取
        [source addObjectsFromArray:[nums1 subarrayWithRange:NSMakeRange(p1, m-p1)]];
    
//        // 遍歷
//        for (int i = p1; i < m; i++) {
//            source[p] = nums1[i];
//            p++;
//        }
    }
    
    if (p2 < n) { // nums2中剩余元素
        [source addObjectsFromArray:[nums2 subarrayWithRange:NSMakeRange(p2, n-p2)]];
//        // 遍歷
//        for (int i = p2; i < n; i++) {
//            source[p] = nums2[i];
//            p++;
//        }
    }
    NSLog(@"source == %@",[source componentsJoinedByString:@","]);
}

方式2:

- (void)merge1:(NSMutableArray *)nums1 m:(int)m nums2:(NSArray *)nums2 n:(int)n {
    
    /**
     *  原理數(shù)這樣的:
     *  1兔辅、創(chuàng)建三個下標(指針)腊敲,分別指向nums1的最后一個元素、nums1的最后一個有效元素 和 nums2的最后一個元素幢妄。
     *      num1的理論長度是m+n,必然有后n位元素是無效的元素兔仰,這里暫時用0來標識茫负。
     *      這里要注意的是nums1需要時可變數(shù)組蕉鸳,否則不能修改元素。
     *  2、創(chuàng)建循環(huán)潮尝,目的是取出nums1[p1] 和 nums2[p2] 中較大的數(shù)字榕吼,放入nums1[p]上,
     *      并將對應的下標減1(p--并且p1--或者p2--)勉失,一直到打破循環(huán)(p1 < 0 或者 p2 < 0)
     *  3羹蚣、循環(huán)完成后,必然出現(xiàn)的結果就是:p1 < 0 并且 p2 >= 0 或者 p2 < 0 并且 p1 >= 0乱凿,兩種情況必然出現(xiàn)一種顽素。
     *      p1 >= 0,nums1中存在較小的元素徒蟆,因此num1中存在未被循環(huán)遍歷到的元素胁出;
     *      p2 >= 0,nums2中存在較小的元素段审,因此num2中存在未被循環(huán)遍歷到的元素全蝶;
     *      我們只需要,倒敘遍歷p1...0 或者 p2...0 出元素寺枉,并賦值到nums[p](p--)中即可抑淫。
     */
    
    // n == 0,即nums2無元素姥闪,直接返回nums1中的有效元素(m個)
    if (n == 0) {
        NSLog(@"source == %@",[[nums1 subarrayWithRange:NSMakeRange(0, m)] componentsJoinedByString:@","]);
        return;
    }
    
    int p  = m+n-1; // 指向nums1的最后一個元素的下標
    int p1 = m-1;   // 指向nums1的最后一個有效元素的下標
    int p2 = n-1;   // 指向nums2的最后一個元素的下標
    
    while (p1 >= 0 && p2 >= 0) {
        if ([nums1[p1] intValue] < [nums2[p2] intValue]) {
            // 取出較大的元素
            nums1[p] = nums2[p2];
            // 下標前移
            p2--;
        }
        else {
            // 取出較大的元素
            nums1[p] = nums1[p1];
            // 下標前移
            p1--;
        }
        // 下標前移
        p--;
    }
    
    if (p1 >= 0) { // nums1中剩余元素
        // 倒敘遍歷
        for (int i = p1; i >= 0; i--) {
            nums1[p] = nums1[i];
            p--;
        }
    }
    
    if (p2 >= 0) { // nums2中剩余元素
        // 倒敘遍歷
        for (int i = p2; i >= 0; i--) {
            nums1[p] = nums2[i];
            p--;
        }
    }
    
    NSLog(@"source == %@",[nums1 componentsJoinedByString:@","]);
}

swift語言實現(xiàn)
方式1:

 func merge(nums1:[Int],m:Int,nums2:[Int],n:Int) -> Void {
        
        var source: [Int] = Array.init(repeating: 0, count: m+n)
        
        var p  = 0
        var p1 = 0
        var p2 = 0
        
        while p1 < m && p2 < n {
            if nums1[p1] < nums2[p2] {
                source[p] = nums1[p1]
                p1 += 1
            }
            else {
                source[p] = nums2[p2]
                p2 += 1
            }
            p += 1
        }
        
        if p1 < m {
            let range  = p..<(p+m-p1)
            let range1 = p1..<m
            source.replaceSubrange(range, with: nums1[range1])
        }
        
        if p2 < n {
            let range  = p..<(p+n-p2)
            let range2 = p2..<n
            source.replaceSubrange(range, with: nums2[range2])
        }
        print("source == ",source)
    }

方式2:

func merge1(nums1: inout [Int],m:Int,nums2:[Int],n:Int) -> Void {
        
        if m == 0 {
            // 空數(shù)組
            return
        }
        
        if n == 0 {
            let range = 0...m
            print("source == ",nums1[range])
            return;
        }
        
        var p  = m+n-1
        var p1 = m-1
        var p2 = n-1

        while p1 >= 0 && p2 >= 0 {
            if nums1[p1] < nums2[p2] {
                nums1[p] = nums2[p2]
                p2 -= 1
            }
            else {
                nums1[p] = nums1[p1]
                p1 -= 1
            }
            p -= 1
        }
        
        if p1 >= 0 {
            for index in 0...p1 {
                nums1[p] = nums1[p1-index]
                p -= 1
            }
        }
        
        if p2 >= 0 {
            for index in 0...p2 {
                nums1[p] = nums2[p2-index]
                p -= 1
            }
        }
        print("source == ",nums1)
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末始苇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子筐喳,更是在濱河造成了極大的恐慌埂蕊,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疏唾,死亡現(xiàn)場離奇詭異蓄氧,居然都是意外死亡,警方通過查閱死者的電腦和手機槐脏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門喉童,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人顿天,你說我怎么就攤上這事堂氯。” “怎么了牌废?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵咽白,是天一觀的道長。 經(jīng)常有香客問我鸟缕,道長晶框,這世上最難降的妖魔是什么排抬? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮授段,結果婚禮上蹲蒲,老公的妹妹穿的比我還像新娘。我一直安慰自己侵贵,他們只是感情好届搁,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著窍育,像睡著了一般卡睦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上漱抓,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天么翰,我揣著相機與錄音,去河邊找鬼辽旋。 笑死浩嫌,一個胖子當著我的面吹牛,可吹牛的內容都是我干的补胚。 我是一名探鬼主播码耐,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼溶其!你這毒婦竟也來了骚腥?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瓶逃,失蹤者是張志新(化名)和其女友劉穎束铭,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體厢绝,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡契沫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了昔汉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片懈万。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖靶病,靈堂內的尸體忽然破棺而出会通,到底是詐尸還是另有隱情,我是刑警寧澤娄周,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布涕侈,位于F島的核電站,受9級特大地震影響煤辨,放射性物質發(fā)生泄漏裳涛。R本人自食惡果不足惜木张,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望调违。 院中可真熱鬧,春花似錦泻轰、人聲如沸技肩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽虚婿。三九已至,卻和暖如春泳挥,著一層夾襖步出監(jiān)牢的瞬間然痊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工屉符, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留剧浸,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓矗钟,卻偏偏與公主長得像唆香,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吨艇,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內容