11. 排序


56. Merge Intervals
Given a collection of intervals, merge all overlapping intervals.

For example,
Given [1,3],[2,6],[8,10],[15,18],
return [1,6],[8,10],[15,18].
融合數(shù)組的重復部分囊卜。1. 對數(shù)組進行排序练俐。 2. 依次判斷結果數(shù)組中最后一個間隔的重疊情況璃俗。
vector<Interval> merge(vector<Interval>& intervals) {
    std::sort(intervals.begin(), intervals.end(), [](Interval a, Interval b){return a.start < b.start;});
    
    vector<Interval> res;
    if (intervals.empty()) return res;
    res.push_back(intervals[0]);
    for (int i = 1; i < intervals.size(); ++i) {
        Interval cur = intervals[i];
        Interval last = res.back();
        if (cur.start <= last.end) {
            res[res.size() - 1].end = max(cur.end, last.end);
        } else {
            res.push_back(cur);
        }
    }
    return res;
}

147. Insertion Sort List
對鏈表使用插入排序涌乳。使用指針preHead指向拍好序的鏈表迎瞧,head指向未排序的鏈表,指針pt是拍好序的鏈表的游標逗抑,當head->val 小于等于 pt->next->val時剧辐,pt向前移動。pt在 pt -> next == NULL時邮府,插在末尾;在另一種結束情況溉奕,代表head節(jié)點插入到小于 pt -> next -> val的pt和pt->next之間褂傀。
時間復雜度:O(n^2)
ListNode* insertionSortList(ListNode* head) {
     ListNode preHead = ListNode(INT_MIN);
     while (head) {
         ListNode *pt = &preHead;
         while (pt -> next &&  pt -> next ->val <= head->val) {
             pt = pt -> next;
         }
         
         ListNode *next = head -> next;
         head -> next = pt -> next;
         pt -> next = head;
         head = next;
     }
     return preHead.next;
}

148. Sort List
解析: 時間復雜度O(nlogn),空間復雜度O(1), 實現(xiàn)鏈表排序(歸并加勤、快排)
邊界:鏈表為空或鏈表只有1個節(jié)點
思路:對一段列表劃分成兩段仙辟,分別對這兩段進行排序,再對排好序的鏈表進行合并鳄梅。 實際上叠国,使用遞歸實現(xiàn)的歸并排序空間復雜度為O(logn),遞歸工作棧大小應該為O(logn)
1. merge函數(shù),常用的兩個排好序的鏈表融合戴尸,別忘了cur 往下走粟焊。
2. 遞歸的結束條件:鏈表為空或鏈表長度為1,代表了最底層的返回值孙蒙。
3. 使用快慢指針對鏈表進行劃分项棠。
4. 分別對兩段調用遞歸排序,并合并挎峦。
時間復雜度:O(nlogn)
// 歸并香追,使用分治思想,這個實現(xiàn)一定要熟悉
ListNode* mergeLists(ListNode *left, ListNode *right) {
    ListNode preHead = ListNode(INT_MIN);
    ListNode *cur = &preHead;
    while (left && right) {
        if (left->val < right->val) {
            cur -> next = left;
            left = left -> next;
        } else {
            cur -> next = right;
            right = right -> next;
        }
        cur = cur -> next;
    }
    
    cur -> next = left?left:right;
    return preHead.next;
}

ListNode* sortList(ListNode* head) {
    if (!head || !head->next) return head;
    ListNode preHead = ListNode(INT_MIN);
    preHead.next = head;
    ListNode *preMid = &preHead, *mid = head;
    while (head && head -> next) {
        preMid = mid;
        mid = mid -> next;
        head = head -> next -> next;
    }
    
    preMid -> next = NULL;
    
    return mergeLists(sortList(preHead.next),sortList(mid));
}
快排(此處給的是基于數(shù)組的坦胶,鏈表實現(xiàn)比較復雜)
思路:partition:對給定數(shù)組取基準元素透典,比它大的放它右邊,比它小的放它左邊顿苇。然后再將數(shù)組按返回的基準元素的位置進行劃分峭咒,遞歸進行。
1. 移動元素技巧性比較強
時間復雜度:O(nlogn)
int partition(int a[], int low, int high)  
{  
    int privotKey = a[low];                             //基準元素  
    while(low < high){                                   //從表的兩端交替地向中間掃描  
        while(low < high  && a[high] >= privotKey) --high;  //從high 所指位置向前搜索岖圈,至多到low+1 位置讹语。將比基準元素小的交換到低端  
        swap(&a[low], &a[high]);  
        while(low < high  && a[low] <= privotKey ) ++low;  
        swap(&a[low], &a[high]);  
    }  
    print(a,10);  
    return low;  
}  
  
  
void quickSort(int a[], int low, int high){  
    if(low < high){  
        int privotLoc = partition(a,  low,  high);  //將表一分為二  
        quickSort(a,  low,  privotLoc -1);          //遞歸對低子表遞歸排序  
        quickSort(a,   privotLoc + 1, high);        //遞歸對高子表遞歸排序  
    }  
}  

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蜂科,隨后出現(xiàn)的幾起案子顽决,更是在濱河造成了極大的恐慌短条,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件才菠,死亡現(xiàn)場離奇詭異茸时,居然都是意外死亡,警方通過查閱死者的電腦和手機赋访,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門可都,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蚓耽,你說我怎么就攤上這事渠牲。” “怎么了步悠?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵签杈,是天一觀的道長。 經(jīng)常有香客問我鼎兽,道長答姥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任谚咬,我火速辦了婚禮鹦付,結果婚禮上,老公的妹妹穿的比我還像新娘择卦。我一直安慰自己敲长,他們只是感情好,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布互捌。 她就那樣靜靜地躺著潘明,像睡著了一般。 火紅的嫁衣襯著肌膚如雪秕噪。 梳的紋絲不亂的頭發(fā)上钳降,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機與錄音腌巾,去河邊找鬼遂填。 笑死,一個胖子當著我的面吹牛澈蝙,可吹牛的內(nèi)容都是我干的吓坚。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼灯荧,長吁一口氣:“原來是場噩夢啊……” “哼礁击!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤哆窿,失蹤者是張志新(化名)和其女友劉穎链烈,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挚躯,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡强衡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了码荔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漩勤。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖缩搅,靈堂內(nèi)的尸體忽然破棺而出越败,到底是詐尸還是另有隱情,我是刑警寧澤硼瓣,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布眉尸,位于F島的核電站,受9級特大地震影響巨双,放射性物質發(fā)生泄漏。R本人自食惡果不足惜霉祸,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一筑累、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丝蹭,春花似錦慢宗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贱田,卻和暖如春缅茉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背男摧。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工蔬墩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人耗拓。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓拇颅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親乔询。 傳聞我的和親對象是個殘疾皇子樟插,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

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

  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經(jīng)驗。 張土汪:刷leetcod...
    土汪閱讀 12,738評論 0 33
  • 首先總結以下Java和C、C++中的一般控制臺輸入方式黄锤,方便以后的編程題: java鍵盤輸入 java讀文件(會自...
    androidjp閱讀 2,281評論 0 16
  • [TOC] 插入排序 紙牌游戲搪缨,為將數(shù)組x[n]按升序排序,首先將第一個元素視為有序子數(shù)組x[0..0],然后插入...
    百煉閱讀 271評論 0 0
  • 今天是孫悠兒的生日齿桃,她的父母為她辦了一場生日宴,來的人都是有頭有臉的人物煮盼。此時此刻短纵,門口停了一輛蘭博基尼,一...
    靜魅閱讀 89評論 0 0
  • 2017年11月22日 周三 日記開頭經(jīng)常抱怨早操的事情僵控,我沒辦法香到。大概屬于情緒比較外放的那種,也是不能很好的...
    徐宸灝閱讀 224評論 0 1