Leetcode.836. Superposición de rectángulos

título

Una lista rectángulo [x1, y1, x2, y2] expresado en la forma, donde (X1, Y1) coordenadas de la esquina inferior izquierda, (x2, y2) son las coordenadas de la esquina superior derecha.

Si el área de intersección es positiva, llamados dos rectángulos se superponen. Para que quede claro, las dos partes rectangulares o sólo en las esquinas del contacto no constituye solapamiento.

Dados dos rectángulos, determina si se superponen y devuelve el resultado.

 

Ejemplo 1:

Entrada: REC1 = [0,0,2,2], REC2 = [1,1,3,3]
de salida: true
Ejemplo 2:

Entrada: REC1 = [0,0,1,1], REC2 = [1,0,2,1]
de salida: false

pensamiento

1 y 2 rectangular proyección rectangular al eje x y el eje Y para ver si el segmento correspondiente se superponen, si hay solapamiento. Aquí he utilizado el método para determinar la superposición de una muy violenta, y atravesar un segmento de línea que apuntan a ver si hay otro en la línea. Por lo tanto se necesita O (min (x2-x1, u2-u1)) + O (min (y2-y1, v2-v1)) de la prueba 1304ms tiempo gastado, apenas pasado.

class Solution {
public:
    bool isRectangleOverlap(vector<int>& rec1, vector<int>& rec2) {
        int x1=rec1[0], y1=rec1[1], x2=rec1[2], y2=rec1[3];
        int u1=rec2[0], v1=rec2[1], u2=rec2[2], v2=rec2[3];

        bool xlap=(x2-x1)<=(u2-u1)?overlap(x1, x2, u1, u2): overlap(u1, u2, x1, x2);
        if(!xlap)
            return false;

        bool ylap = (y2-y1)<=(v2-v1)?overlap(y1, y2, v1, v2): overlap(v1, v2, y1, y2);
        if(!ylap)
            return false;

        return true;
    }
    bool overlap(int x1, int x2, int u1, int u2){//O(min(x2-x1, u2-u1)
        for(int i=x1; i<=x2; i++){
            if(u1<i&&i<u2)
                return true;
        }
        return false;
    }
};

optimización

De hecho, se puede determinar directamente a partir de la posición del segmento de línea. . Por ejemplo: eje x max (x1, u1) <min tiempo (x2, u2), un segmento de línea x1-x2 y u1-u2 de intersección. La misma idea, pero el código es muy simple.

class Solution {
public:
    bool isRectangleOverlap(vector<int>& rec1, vector<int>& rec2) {
        return max(rec1[0], rec2[0])<min(rec1[2], rec2[2]) && max(rec1[1], rec2[1])<min(rec1[3], rec2[3]);
    }
};

 

Publicado 18 artículos originales · ganado elogios 0 · Vistas 782

Supongo que te gusta

Origin blog.csdn.net/afiguresomething/article/details/104945942
Recomendado
Clasificación