您的位置:首页 > 编程语言 > C#

LeetCode Online Judge 题目C# 练习 - Insert Interval

2012-09-13 22:00 417 查看
Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).

You may assume that the intervals were initially sorted according to their start times.

Example 1:
Given intervals [1,3],[6,9], insert and merge [2,5] in as [1,5],[6,9].

Example 2:
Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].

This is because the new interval [4,9] overlaps with [3,5],[6,7],[8,10].

public struct Interval
{
public int start;
public int end;

public Interval(int s, int e)
{
start = s;
end = e;
}
}

public static List<Interval> InsertInterval(List<Interval> intervals, Interval newInterval)
{
int newS = -1;
int newE = -1;
List<Interval> ret = new List<Interval>();

if (intervals.Count == 0)
{
ret.Add(newInterval);
return ret;
}

if (newInterval.end < intervals[0].start)
{
ret.Add(newInterval);
foreach (var item in intervals)
{
ret.Add(item);
}
return ret;
}

if (newInterval.start > intervals[intervals.Count - 1].end)
{
foreach (var item in intervals)
{
ret.Add(item);
}
ret.Add(newInterval);
return ret;
}

if (newInterval.start <= intervals[0].start && newInterval.end >= intervals[intervals.Count - 1].end)
{
ret.Add(newInterval);
return ret;
}

if (newInterval.start <= intervals[0].start)
{
newS = newInterval.start;
foreach (var item in intervals)
{
if (newInterval.end > item.end)
{
continue;
}
if (newE == -1 && newInterval.end >= item.start && newInterval.end <= item.end)
{
newE = item.end;
ret.Add(new Interval(newS, newE));
continue;
}
if (newE == -1 && newInterval.end < item.start)
{
newE = newInterval.end;
ret.Add(new Interval(newS, newE));
ret.Add(item);
continue;
}
ret.Add(item);
}
return ret;
}

if (newInterval.end >= intervals[intervals.Count - 1].end)
{
newE = newInterval.end;
foreach (var item in intervals)
{
if (newInterval.start > item.end)
{
ret.Add(item);
continue;
}
if (newS == -1 && newInterval.start >= item.start && newInterval.start <= item.end)
{
newS = item.start;
ret.Add(new Interval(newS, newE));
return ret;
}
if (newS == -1 && newInterval.start < item.start)
{
newS = newInterval.start;
ret.Add(new Interval(newS, newE));
return ret;
}
}
return ret;
}

foreach (var item in intervals)
{
if (newS == -1 && newInterval.start < item.start)
{
newS = newInterval.start;
continue;
}
if (newS == -1 && newInterval.start >= item.start && newInterval.start <= item.end)
{
newS = item.start;
continue;
}
if (newS == -1 && newInterval.start > item.end)
{
ret.Add(item);
}

if (newInterval.end > item.end)
{
continue;
}
if (newE == -1 && newInterval.end >= item.start && newInterval.end <= item.end)
{
newE = item.end;
ret.Add(new Interval(newS, newE));
continue;
}
if (newE == -1 && newInterval.end < item.start)
{
newE = newInterval.end;
ret.Add(new Interval(newS, newE));
ret.Add(item);
continue;
}

ret.Add(item);
}

return ret;
}


代码分析:

  分6种情况:

  1. [0,1] [2,3] [5,6] [8,9]

  2. [2,3] [5,6] [8,9] [10,11]

  3. [1, 10]

    [2,3] [5,6] [8,9]

  4. [1, 4]

    [2,3] [5,6] [8,9]

  5.       [7, 10]

    [2,3] [5,6] [8,9]

  6.   [4, 7]

    [2,3] [5,6] [8,9]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: