Leetcode - Insert Interval

Screenshot from 2016-01-11 18:59:19.png

My code:

/**
 * Definition for an interval.
 * public class Interval {
 *     int start;
 *     int end;
 *     Interval() { start = 0; end = 0; }
 *     Interval(int s, int e) { start = s; end = e; }
 * }
 */
public class Solution {
    public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
        ArrayList<Interval> ret = new ArrayList<Interval>();
        if (intervals == null || intervals.size() == 0) {
            ret.add(newInterval);
            return ret;
        }
        if (newInterval == null)
            return intervals;
        ret.add(newInterval);
        for (int i = 0; i < intervals.size(); i++) {
            Interval originInterval = intervals.get(i);
            int originStart = originInterval.start;
            int originEnd = originInterval.end;
            for (int j = ret.size() - 1; j >= -1; j--) {
                if (j == -1) { // if it is minimun, insert at the beginning whose index is 0
                    ret.add(0, originInterval);
                    break;   
                }
                Interval retInterval = ret.get(j);
                int retStart = retInterval.start;
                int retEnd = retInterval.end;
                if (originStart > retEnd) { // if bigger than this element, insert behind it, so the inserting index should be j + 1
                    ret.add(j + 1, originInterval);
                    break;
                }
                else if (originEnd < retStart) { // if smaller than this element, visit the front elements to compare
                    continue;
                }
                else {
                    retInterval.start = Math.min(originStart, retStart); // if needs merge, change values so to merge
                    retInterval.end = Math.max(originEnd, retEnd);
                    break;
                }
            }
        }
        return ret;
    }
}

這道題木之前做過(guò)雌隅,但應(yīng)該沒(méi)有寫文章。但還有印象。
自己寫了出來(lái)恰起。
其實(shí)就是一個(gè)插入 + merge的過(guò)程修械。
怎么樣才能讓這個(gè)過(guò)程足夠簡(jiǎn)單并且可以用程序?qū)崿F(xiàn)。
This is the question we need to deal with.
Fuck off!
如果就在 intervals上實(shí)現(xiàn)這么一個(gè)過(guò)程检盼。
那么會(huì)很復(fù)雜祠肥,思考起來(lái)。
你想梯皿,
你如何判斷什么時(shí)候仇箱,該merge?
那么东羹,我現(xiàn)在的思路是剂桥,
假設(shè):
originStart, originEnd 為intervals其中某個(gè)元素的起始。
newStart, newEnd 為需要插入元素的起始属提。
So,

for (int i = 0; i < intervals.size(); i++) {
     if (newStart > originEnd)
           continue;
     else if (newEnd < originStart)
           intervals.add(i, newInterval);
     else {
           
     }
}

想著想著权逗,突然發(fā)現(xiàn)也可以做,而且更加簡(jiǎn)潔冤议,只要一次遍歷就行斟薇。。恕酸。
于是寫了出來(lái)堪滨。
我他媽真他媽,變強(qiáng)了蕊温,草袱箱。
**
但是奇怪的一點(diǎn),
我覺(jué)得這么做速度更快义矛,但是LJ上顯示发笔,速度反而更慢了,怎么會(huì)呢凉翻?不能理解了讨。到時(shí)候得問(wèn)下人。
**

我一開始的做法就是新建一個(gè)集合制轰,然后先把newInterval放進(jìn)去前计,然后把intervals里面的元素一個(gè)個(gè)有序放進(jìn)去,需要merge的地方就merge艇挨,然后就寫出來(lái)了残炮。
第二個(gè)做法就是針對(duì)intervals來(lái)做。
思路在上面的偽代碼上基本上也寫明白了缩滨。
但是,為什么速度反而慢了很多呢?

/**
 * Definition for an interval.
 * public class Interval {
 *     int start;
 *     int end;
 *     Interval() { start = 0; end = 0; }
 *     Interval(int s, int e) { start = s; end = e; }
 * }
 */
public class Solution {
    public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
        ArrayList<Interval> ret = new ArrayList<Interval>();
        if (intervals == null || intervals.size() == 0) {
            ret.add(newInterval);
            return ret;
        }
        if (newInterval == null)
            return intervals;
        ret.add(newInterval);
        int newStart = newInterval.start;
        int newEnd = newInterval.end;
        int i = 0;
        for (; i < intervals.size(); i++) {
            int originStart = intervals.get(i).start;
            int originEnd = intervals.get(i).end;
            if (newStart > originEnd)
                continue;
            else if (newEnd < originStart) {
                intervals.add(i, new Interval(newStart, newEnd));
                break;
            }
            else { // update newStart, newEnd,remove origin element, later will add updated element(merge)
                newStart = Math.min(originStart, newStart);
                newEnd = Math.max(originEnd, newEnd);
                intervals.remove(i);
                i--;
            }
        }
        if (i == intervals.size())
            intervals.add(new Interval(newStart, newEnd));
        return intervals;
    }
}

這道題目級(jí)別是hard脉漏,但是現(xiàn)在想來(lái)沒(méi)有什么難度苞冯。
DP才是王道啊。

Anyway, Good luck, Richardo!

More efficient solution:
My code:

/**
 * Definition for an interval.
 * public class Interval {
 *     int start;
 *     int end;
 *     Interval() { start = 0; end = 0; }
 *     Interval(int s, int e) { start = s; end = e; }
 * }
 */
public class Solution {
    public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
        ArrayList<Interval> ret = new ArrayList<Interval>();
        if (intervals == null || intervals.size() == 0) {
            ret.add(newInterval);
            return ret;
        }
        for (int i = 0; i < intervals.size(); i++) {
            Interval curr = intervals.get(i);
            if (curr.end < newInterval.start) {
                ret.add(curr);
            }
            else if (curr.start > newInterval.end) {
                ret.add(newInterval);
                newInterval = curr;
            }
            else if (curr.start <= newInterval.start || curr.end >= newInterval.end) {
                newInterval = new Interval(Math.min(curr.start, newInterval.start), Math.max(curr.end, newInterval.end));
            }
        }
        ret.add(newInterval);
        return ret;
    }
}

Anyway, Good luck, Richardo!

My code:

/**
 * Definition for an interval.
 * public class Interval {
 *     int start;
 *     int end;
 *     Interval() { start = 0; end = 0; }
 *     Interval(int s, int e) { start = s; end = e; }
 * }
 */
public class Solution {
    public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
        List<Interval> ret = new ArrayList<Interval>();
        if (intervals == null || intervals.size() == 0) {
            ret.add(newInterval);
            return ret;
        }
        else if (newInterval == null) {
            return intervals;
        }
        
        Interval curr = newInterval;
        for (int i = intervals.size() - 1; i >= 0; i--) {
            Interval pre = intervals.get(i);
            if (pre.end < curr.start) {
                intervals.add(i + 1, curr);
                return intervals;
            }
            else if (pre.start <= curr.start) {
                pre.end = Math.max(pre.end, curr.end);
                return intervals;
            }
            else if (pre.start <= curr.end) {
                pre.start = curr.start;
                pre.end = Math.max(pre.end, curr.end);
                curr = pre;
                intervals.remove(i);
            }
            else {
                continue;
            }
        }
        
        intervals.add(0, curr);
        return intervals;
    }
}

和merge interval差不多侧巨,是他的一個(gè)子問(wèn)題舅锄。

Anyway, Good luck, Richardo! -- 09/02/2016

My code:

/**
 * Definition for an interval.
 * public class Interval {
 *     int start;
 *     int end;
 *     Interval() { start = 0; end = 0; }
 *     Interval(int s, int e) { start = s; end = e; }
 * }
 */
public class Solution {
    public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
        List<Interval> ret = new ArrayList<Interval>();
        int i = 0;
        for (; i < intervals.size(); i++) {
            Interval curr = intervals.get(i);
            if (curr.end < newInterval.start) {
                ret.add(curr);
                continue;
            }
            else {
                break;
            }
        }
        
        for (; i < intervals.size(); i++) {
            Interval curr = intervals.get(i);
            if (curr.start > newInterval.end) {
                break;
            }
            newInterval.start = Math.min(newInterval.start, curr.start);
            newInterval.end = Math.max(newInterval.end, curr.end);
        }
        
        ret.add(newInterval);
        for (; i < intervals.size(); i++) {
            ret.add(intervals.get(i));
        }
        
        return ret;
    }
}

reference:
https://discuss.leetcode.com/topic/7808/short-and-straight-forward-java-solution

這個(gè)做法比之前的做法更高效,可以保證 O(n) 的復(fù)雜度

Anyway, Good luck, Richardo! -- 10/15/2016

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末司忱,一起剝皮案震驚了整個(gè)濱河市皇忿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坦仍,老刑警劉巖鳍烁,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異繁扎,居然都是意外死亡幔荒,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門梳玫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)爹梁,“玉大人,你說(shuō)我怎么就攤上這事提澎∫” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵盼忌,是天一觀的道長(zhǎng)莉炉。 經(jīng)常有香客問(wèn)我,道長(zhǎng)碴犬,這世上最難降的妖魔是什么絮宁? 我笑而不...
    開封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮服协,結(jié)果婚禮上绍昂,老公的妹妹穿的比我還像新娘。我一直安慰自己偿荷,他們只是感情好窘游,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著跳纳,像睡著了一般忍饰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寺庄,一...
    開封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天艾蓝,我揣著相機(jī)與錄音力崇,去河邊找鬼。 笑死赢织,一個(gè)胖子當(dāng)著我的面吹牛亮靴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播于置,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼茧吊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了八毯?” 一聲冷哼從身側(cè)響起搓侄,我...
    開封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎话速,沒(méi)想到半個(gè)月后讶踪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尿孔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年俊柔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片活合。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡雏婶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出白指,到底是詐尸還是另有隱情留晚,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布告嘲,位于F島的核電站错维,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏橄唬。R本人自食惡果不足惜赋焕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望仰楚。 院中可真熱鬧隆判,春花似錦、人聲如沸僧界。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)捂襟。三九已至咬腕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間葬荷,已是汗流浹背涨共。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工纽帖, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人煞赢。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓抛计,卻偏偏與公主長(zhǎng)得像哄孤,于是被迫代替她去往敵國(guó)和親照筑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

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

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問(wèn)題, 分享了一些自己做題目的經(jīng)驗(yàn)瘦陈。 張土汪:刷leetcod...
    土汪閱讀 12,747評(píng)論 0 33
  • My code: 這道題目我沒(méi)有做出來(lái)凝危。應(yīng)該說(shuō),我做出來(lái)了晨逝,但是超時(shí)了蛾默。我也想到了用dp,但是用的是二維數(shù)組捉貌。后來(lái)...
    Richardo92閱讀 524評(píng)論 0 0
  • 這道題目是用排序做不出來(lái)的支鸡。很沒(méi)含量。然后看了下 quick selection 算法趁窃。打算明天自己重寫下牧挣。待補(bǔ)充...
    Richardo92閱讀 777評(píng)論 1 1
  • Question: My code: My test result: 這次題目做了好久。醒陆。瀑构。每次都是時(shí)間測(cè)試過(guò)不了...
    Richardo92閱讀 593評(píng)論 0 1
  • My code: My test result: 這道題目不算很難。一直在思考一個(gè)問(wèn)題刨摩,如何保存這種范圍的映射寺晌,這...
    Richardo92閱讀 363評(píng)論 0 1