Interval Interval scheduling of merger

Interval Interval scheduling of merger

Or look at a question:
Here Insert Picture Description

First, the problem-solving ideas

It can be expressed as a range [start, end], interval overlap区间调度问题,需要按 end 排序 , to meet the greedy choice properties. For 区间合并问题,其实按 end 和 start 排序都可以, but for the sake of clarity, we have chosen sorted by start.

Here Insert Picture Description

Obviously,Several sections intersecting combined results interval x, x.start must intersect these minimum interval start, x.end these intersecting interval must end the largest

Here Insert Picture Description

Due 已经排了序,x.start 很好确定,求 x.end 也很容易,可以类比在数组中找最大值的process:

int max_ele = arr[0];
for (int i = 1; i < arr.length; i++) 
    max_ele = max(max_ele, arr[i]);
return max_ele;

Second, the complete code

# intervals 形如 [[1,3],[2,6]...]
def merge(intervals):
    if not intervals: return []
    # 按区间的 start 升序排列
    intervals.sort(key=lambda intv: intv[0])
    res = []
    res.append(intervals[0])

    for i in range(1, len(intervals)):
        curr = intervals[i]
        # res 中最后一个元素的引用
        last = res[-1]
        if curr[0] <= last[1]:
            # 找到最大的 end
            last[1] = max(last[1], curr[1])
        else:
            # 处理下一个待合并区间
            res.append(curr)
    return res

C ++ code:

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        vector<vector<int>> ret;
        if(intervals.empty())
        {
            return ret;
        }

        //先对intervals的每个区间按第一个元素(start)进行生序排序
        sort(intervals.begin(),intervals.end(),
                [&, this](vector<int> &v1, vector<int> &v2) 
                { 
                    return v1[0] < v2[0];
                });

        //遍历整个数组
        for (int i = 0; i < intervals.size(); ++i) 
        {
            //定义一个临时变量,方便用来寻找区间的右边界
            vector<int> temp = intervals[i];

            //代表当前区间和intervals中的下一个区间重叠
            //规定区间[start,end]
            //temp[1] >= intervals[i+1][0]代表当前区间的end位置大于等于下一个区间的start位置
            //如果出现第一个区间的end大于第二个区间的end,可以直接忽略,没起到任何作用
            while (i + 1 < intervals.size() && temp[1] >= intervals[i+1][0]) 
            {
                //继续遍历,因为此时的右边界不一定是最优的,可能还有重叠区间
                ++i;
                //更新区间的右边界
                temp[1] = max(temp[1], intervals[i][1]);
            }
            //记录结果
            ret.push_back(temp);
        }
        return ret;
    }
};

So far, the combined range problem is solved.

Published 126 original articles · won praise 57 · views 90000 +

Guess you like

Origin blog.csdn.net/wolfGuiDao/article/details/104713060