Intervalo de programación intervalo de fusión

Intervalo de programación intervalo de fusión

O mirar a una pregunta:
Aquí Insertar imagen Descripción

En primer lugar, las ideas de resolución de problemas

Se puede expresar como una gama [principio, fin], la superposición de intervalo区间调度问题,需要按 end 排序 , para satisfacer las propiedades de elección codiciosos. Para 区间合并问题,其实按 end 和 start 排序都可以, pero en aras de la claridad, hemos elegido ordenado por principio.

Aquí Insertar imagen Descripción

obviamente,Varias secciones de intersección resultados combinados x intervalo, x.start debe formar intersección con éstos mínimo intervalo de salida, éstos x.end intervalo de intersección deben poner fin a la mayor.

Aquí Insertar imagen Descripción

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

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

En segundo lugar, el código completo

# 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ódigo C ++:

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;
    }
};

Hasta ahora, el problema se resuelve gama combinada.

Publicados 126 artículos originales · ganado elogios 57 · Vistas a 90000 +

Supongo que te gusta

Origin blog.csdn.net/wolfGuiDao/article/details/104713060
Recomendado
Clasificación