LeetCode刷题191124

博主渣渣一枚,刷刷leetcode给自己瞅瞅,大神们由更好方法还望不吝赐教。题目及解法来自于力扣(LeetCode),传送门

算法:

给出一个无重叠的 ,按照区间起始端点排序的区间列表。

在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

示例 1:

输入: intervals = [[1,3],[6,9]], newInterval = [2,5]
输出: [[1,5],[6,9]]
示例 2:

输入: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
输出: [[1,2],[3,10],[12,16]]
解释: 这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。

public class Solution {
public int[][] Insert(int[][] intervals, int[] newInterval)
        {
            var start = 0;
            var end = 0;

            bool NeedMergeStar = false;
            bool NeddMergeEnd = false;

            var result = new List<int[]>();

            while (start < intervals.Length)
            {

                if (intervals[start][0] == newInterval[0] || (intervals[start][0] < newInterval[0] && intervals[start][1] >= newInterval[0]))
                {
                    NeedMergeStar = true;
                    break;
                }
                else if (intervals[start][0] > newInterval[0])
                {
                    break;
                }

                start++;
            }

            while (end < intervals.Length)
            {
                if (intervals[end][1] == newInterval[1] || (intervals[end][1] > newInterval[1] && intervals[end][0] <= newInterval[1]))
                {
                    NeddMergeEnd = true;
                    break;
                }
                else if (intervals[end][0] > newInterval[1])
                {
                    break;
                }

                end++;
            }

            var index = intervals.Length - 1;

            if (!NeedMergeStar && !NeddMergeEnd)
            {
                if (start == index && end == index)
                {
                    if (intervals[0][0] > newInterval[1])
                    {
                        result.Add(newInterval);
                        result.AddRange(intervals);
                    }
                    else if (intervals[index][1] < newInterval[0])
                    {
                        result.AddRange(intervals);
                        result.Add(newInterval);
                    }
                    else
                    {
                        result.AddRange(intervals);
                        result.Insert(start, newInterval);
                    }
                }
                else
                {
                    if (start == end)
                    {
                        result.AddRange(intervals);
                        result.Insert(start, newInterval);
                    }
                    else
                    {
                        result.AddRange(intervals);

                        for (int i = start; i < end; i++)
                        {
                            result.RemoveAt(start);
                        }

                        result.Insert(start, newInterval);
                    }
                }
            }
            else
            {
                result.AddRange(intervals);

                if (NeedMergeStar && !NeddMergeEnd)
                {
                    if (start == end)
                    {
                        result[start][1] = Math.Max(result[start][1], newInterval[1]);
                    }
                    else
                    {
                        newInterval[0] = intervals[start][0];
                        
                        for (int i = start; i < end; i++)
                        {
                            result.RemoveAt(start);
                        }

                        result.Insert(start, newInterval);
                    }

                }
                else if (!NeedMergeStar && NeddMergeEnd)
                {
                    if (start == end)
                    {
                        result[start][0] = Math.Min(result[start][0], newInterval[0]);
                    }
                    else
                    {
                        newInterval[1] = intervals[end][1];

                        for (int i = start; i <= end; i++)
                        {
                            result.RemoveAt(start);
                        }

                        result.Insert(start, newInterval);
                    }

                }
                else
                {
                    newInterval[0] = intervals[start][0];
                    newInterval[1] = intervals[end][1];

                    for (int i = start; i <= end; i++)
                    {
                        result.RemoveAt(start);
                    }

                    result.Insert(start, newInterval);
                }
            }

            return result.ToArray();
        }
}

  分情况讨论的,效率不是很高emmm。

posted @ 2019-11-24 18:08  DogTwo  阅读(93)  评论(0编辑  收藏  举报