leetcode | 57. Insert Interval

题目

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:

Input: intervals = [[1,3],[6,9]], newInterval = [2,5]
Output: [[1,5],[6,9]]

Example 2:

Input: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
Output: [[1,2],[3,10],[12,16]]
Explanation: Because the new interval [4,8] overlaps with [3,5],[6,7],[8,10].

思路与解法

intervals列表中的区间intervalnewInterval有三种不同情况:①inteval在左,且两者不相交;②两者相交;③interval在右,且两者不相交。
当处于第①种情况时,直接将interval加入到结果列表中即可;
当处于第②中情况时,更新newInterval的左端点和右端点;
当处于第③种情况时,将interval加入到结果列表中。

代码实现(GO)

/**
 * Definition for an interval.
 * type Interval struct {
 *     Start int
 *     End   int
 * }
 */
func min(a, b int) int {
    if a < b {
        return a
    }
    return b
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}


func insert(intervals []Interval, newInterval Interval) []Interval {
    intervals_merged := make([]Interval, 0)
    flag := false
    var i int
    var interval Interval
    // 遍历整个intervals区间
    for i, interval = range intervals {
        // 当interval右端点 < newInterval左端点,说明两者无交集,即可将interval加入到intervals_merged中
        if interval.End < newInterval.Start {
            intervals_merged = append(intervals_merged, interval)
        } else if interval.Start > newInterval.End {
            // 当interval左端点 > newInterval右端点,说明两者无交集,且newInterval不会再次更新,即可将newInterval加入到intervals_merged中
            flag = true
            intervals_merged = append(intervals_merged, newInterval)
            break
        } else {
            // 若interval和newInterval有交集,则更新newInterval
            newInterval.Start = min(interval.Start, newInterval.Start)
            newInterval.End = max(interval.End, newInterval.End)
        }
    }
    // flag == true,说明已经将newInterval加入到intervals_merged中,之后再将intervals[i:]加入即可
    if flag == true {
        intervals_merged = append(intervals_merged, intervals[i:]...)
    } else {
        // flag == false,说明没有将newInterval加入到intervals_merged,intervals中没有并未遍历过的区间
        intervals_merged = append(intervals_merged, newInterval)
    }
    return intervals_merged
}

测试结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/liuyh73/article/details/84727163