problema intervalo de intervalo de planificación de intersección

problema intervalo de intervalo de planificación de intersección

Intervalo de planificación escribió un total de 3 blog, los dos primeros se superponen secciones y secciones fusión dijeron intervalo 最大不相交子集和重叠区间的合并, escribir un algoritmo, hoy, se 快速找出两组区间的交集.

Aquí Insertar imagen Descripción

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

Ideas de intervalo para resolver el problema de que es general 先排序, con el fin de operar, pero el tema que ha sido ordenados, entonces se puede 用两个索引指针在 A 和 B 中游走,把交集找出来código de algo como esto:

# A, B 形如 [[0,2],[5,10]...]
def intervalIntersection(A, B):
    i, j = 0, 0
    res = []
    while i < len(A) and j < len(B):
        # ...
        j += 1
        i += 1
    return res

Difícil, vamos a analizar honestamente diversas situaciones.

En primer lugar, para los dos intervalos, que utiliza [a1, a2] y [b1, b2] representa las dos secciones A y B, que no hay intersección de estos dos intervalos en qué circunstancias :

Aquí Insertar imagen Descripción
Sólo estos dos casos, código condicional escrita es la siguiente:

if b2 < a1 or a2 < b1:
    [a1,a2][b1,b2] 无交集

Así, en qué circunstancias, no es la intersección de dos intervalos que? Según negar la proposición, la lógica de la proposición anterior es si la presencia de intersección:

# 不等号取反,or 也要变成 and
if b2 >= a1 and a2 >= b1:
    [a1,a2][b1,b2] 存在交集

A continuación, el caso de dos intervalos existe intersección, lo que hace? 穷举salida:

Aquí Insertar imagen Descripción

Es muy simple, es sólo estos cuatro casos. Así que, yo creo, en este tipo de situaciones, si hay una intersección en común?

Aquí Insertar imagen Descripción

Nos sorprendió encontrar que el intervalo de intersección es normal! Si la intersección es el intervalo [c1, c2],Bien c1 = max (a1, b1), c2 = min (a2, b2)! Se trata de encontrar la intersección del núcleo , que aún más el código:

while i < len(A) and j < len(B):
    a1, a2 = A[i][0], A[i][1]
    b1, b2 = B[j][0], B[j][1]
    if b2 >= a1 and a2 >= b1:
        res.append([max(a1, b1), min(a2, b2)])
    # ...

El paso final, puntero de i y j están seguros de antemano (incremento), y cuándo debe ir hacia adelante?

Aquí Insertar imagen Descripción
Ya sea 只取决于 a2 和 b2 的大小关系hacia adelante . código:

while i < len(A) and j < len(B):
    # ...
    if b2 < a2:
        j += 1
    else:
        i += 1

código completo:

# A, B 形如 [[0,2],[5,10]...]
def intervalIntersection(A, B):
    i, j = 0, 0 # 双指针
    res = []
    while i < len(A) and j < len(B):
        a1, a2 = A[i][0], A[i][1]
        b1, b2 = B[j][0], B[j][1]
        # 两个区间存在交集
        if b2 >= a1 and a2 >= b1:
            # 计算出交集,加入 res
            res.append([max(a1, b1), min(a2, b2)])
        # 指针前进
        if b2 < a2: j += 1
        else:       i += 1
    return res

Código C ++:

class Solution {
public:
    vector<vector<int>> intervalIntersection(vector<vector<int>>& A, vector<vector<int>>& B) {
        //保存结果
        vector<vector<int>> ret;
        if(A.empty() || B.empty())
        {
            return ret;
        }

        //i和j两个下标索引
        int i = 0;
        int j = 0;
        while(i < A.size() && j < B.size())
        {
            //下面四个变量的含义相见博客
            int a1 = A[i][0];
            int a2 = A[i][1];
            int b1 = B[j][0];
            int b2 = B[j][1];

            //代表区间有交集,自己画个图就OK
            if(b2 >= a1 && a2 >= b1)
            {
                //max(a1,b1),min(a2,b2)两个区间的交集部分
                ret.push_back({max(a1,b1),min(a2,b2)});
            }

            //更新i和j下标索引,b2 < a2 就代表i所在的区间大于j所在的区间,更新j
            //是因为i区间长于j区间的部分还可能和j的下一个区间继续重叠,还需要继续判断
            //所以更新j而不是更新i
            if(b2 < a2)
            {
                j++;
            }
            else//反之同理
            {
                i++;
            }
        }   
        return ret;
    }
};

Para resumir, la sección se parece el problema es más complejo, difícil de manejar una gran cantidad de situaciones, pero en realidad se pueden encontrar mediante la observación de la ley de similitud entre diferentes situaciones, puede manejar con código simple.

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

Supongo que te gusta

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