Insert Interval@LeetCode

Insert Interval

這道題我今天從新看我之前提交的代碼時,差點看吐了,巨複雜無比,先上代碼,而後再分析爲何我當初會這樣寫。java

javapublic class Solution {
    public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
        Comparator<Interval> comparator = new Comparator<Interval>() {
            @Override
            public int compare(Interval o1, Interval o2) {
                if (o1.start == o2.start)
                    return o1.end - o2.end;
                return o1.start - o2.start;
            }
        };
        Collections.sort(intervals, comparator);
        boolean inserted = false;
        int index = 0;
        while (index < intervals.size()) {
            int re = cmpInterval(newInterval, intervals.get(index));
            switch (cmpInterval(newInterval, intervals.get(index))) {
                case -2:
                    if ((0 < index && intervals.get(index - 1).end < newInterval.start) || index == 0)
                        intervals.add(index, newInterval);
                    inserted = true;
                    break;
                case -1:
                    intervals.get(index).start = newInterval.start;
                    if (0 < index && intervals.get(index - 1).end >= intervals.get(index).start) {
                        intervals.get(index - 1).end = Math.max(intervals.get(index).end, intervals.get(index - 1).end);
                        intervals.remove(intervals.get(index));
                    }
                    inserted = true;
                    break;
                case 0:
                    inserted = true;
                    break;
                case 1:
                    intervals.get(index).end = newInterval.end;
                    index++;
                    break;
                case 2:
                    if (index == intervals.size() - 1) {
                        intervals.add(newInterval);
                        inserted = true;
                    } else {
                        index++;
                    }
                    break;
                case 3:
                    intervals.remove(intervals.get(index));
                    break;
                default:
                    continue;
            }
            if (inserted)
                break;
        }
        if (intervals.size() == 0 || intervals.get(intervals.size() - 1).end < newInterval.start) {
            intervals.add(newInterval);
        }
        return intervals;
    }

    public int cmpInterval(Interval toInsert, Interval interval) {
        if (toInsert.start < interval.start) {
            if (toInsert.end < interval.start)
                return -2;
            else if (interval.start <= toInsert.end && toInsert.end <= interval.end)
                return -1;
            else
                return 3;
        } else if (interval.start <= toInsert.start && toInsert.start <= interval.end) {
            if (interval.start <= toInsert.end && toInsert.end <= interval.end)
                return 0;
            else
                return 1;
        } else {
            return 2;
        }
    }
}

我當時的想法很是樸素,就是用帶插入的區間去原區間列表中一個個比較,問題就出在這個比較的結果會不少,能夠看到我代碼裏面用了5個值來表明5中不一樣的比較結果(這裏的先後是以數軸爲座標):segmentfault

  • -2:待插入區間位於當前區間前方,且無重疊部分
  • -1:待插入區間位於當前區間前方,但有重疊部分
  • 3: 待插入區間包含當前區間
  • 0:待插入區間包含於當前區間
  • 1:待插入區間位於當前區間後方,但有重疊部分
  • 2:待插入區間位於當前區間後方,且無重疊部分

是否是看着都蛋疼,的確,從新看代碼的時候,我也是花了很久才理清這全部狀況,這樣的代碼可讀性實在太差,並且是在太複雜。其實這題很是很是容易想到思路,尤爲是當你已經作過前一題Merge Intervals,只要稍微細看就知道這題只是前一題的稍微變形,解決的方法只要把新區間插入到原區間數組中,而後從新合併下便可,具體的合併方法在Merge Intervals@LeetCode中給出。數組

本題的具體的實現代碼以下:ide

javapublic class Solution {
    public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
        List<Interval> result = new ArrayList<Interval>();
        if (intervals == null) return result;
        intervals.add(newInterval);
        Comparator<Interval> comparator = new Comparator<Interval>() {
            @Override
            public int compare(Interval o1, Interval o2) {
                if (o1.start == o2.start) {
                    return o1.end - o2.end;
                }
                return o1.start - o2.start;
            }
        };
        Collections.sort(intervals, comparator);
        for (Interval interval : intervals) {
            int last = result.size();
            if (last == 0 || result.get(last - 1).end < interval.start) {
                Interval interval1 = new Interval(interval.start, interval.end);
                result.add(interval1);
            } else {
                result.get(last - 1).end = Math.max(interval.end, result.get(last - 1).end);
            }
        }
        return result;
    }
}
相關文章
相關標籤/搜索