若之前有做过【56.合并区间】,可以直接插入集合,然后用【56.合并区间】的逻辑处理一遍即可。
我的思路是遍历集合,寻找插入点。
若当前遍历区间[a,b]在待插入区间[c,d]后面,直接插到前面即可([c,d],[a,b])
如果存在重合部分,若d <= b,有 c < a=>[c,b] 和 a<=c=>[a,b]这两种情况
若d > b,则需要继续往后走,寻找后续区间[e,f]满足e<d的区间,若f>d,则插入[a,f],否则[a,d]
public class Solution {
public int[][] Insert(int[][] intervals, int[] newInterval) {
List<int[]> list = new List<int[]>();
int c = newInterval[0],d = newInterval[1];
bool flag = false;
for(int i = 0; i < intervals.Length; i++)
{
if(flag)
{
list.Add(intervals[i]);
continue;
}
// intervals[i] [a,b]
// newInterval [c,d]
int a = intervals[i][0], b = intervals[i][1];
if(a > d)//a > d => [c,d],[a,b]
{
list.Add(newInterval);
list.Add(intervals[i]);
flag = true;
continue;
}
else if(b < c)// b < c => [a,b],...[c,d]
{
list.Add(intervals[i]);
continue;
}
else if(c < a && a <= d && d <= b) // c <= a <= d <= b => [c,b]
{
list.Add(new int[]{c,b});
flag = true;
continue;
}
else if(a <= c && d <= b)//a <= c < d <= d
{
list.Add(intervals[i]);
flag = true;
continue;
}
else if(a <= c && b < d)
{
flag = true;
while(i < intervals.Length - 1 && intervals[i+1][0] <= d )
{
i++;
if(intervals[i][1] >= d)
{
d = intervals[i][1];
break;
}
}
list.Add(new int[]{a,d});
}
}
if(!flag)
list.Add(newInterval);
return list.ToArray();
}
}