Задачи геометрии Leetcode, делящие квадрат пополам

Вопрос собеседования 16.13.Разделить квадрат пополам.

середина

13

сопутствующий бизнес

Даны два квадрата и двумерная плоскость. Найдите линию, которая делит два квадрата пополам. Предположим, что верхняя и нижняя стороны квадрата параллельны оси X.

Данные каждого квадрата squareсодержат 3 значения, координаты нижней левой вершины квадрата [X,Y] = [square[0],square[1]]и длину стороны квадрата square[2]. Требуемая прямая, проходящая через два квадрата, образует 4 точки пересечения. Пожалуйста, верните координаты двух конечных точек отрезка, образованного 4 точками пересечения (две конечные точки — это 2 самые дальние точки среди 4 точек пересечения, и эти 2 точки соединяются в форму. Отрезок линии должен проходить через две другие точки пересечения). [X1,Y1]Возвращаемый формат суммы координат двух конечных точек [X2,Y2]: {X1,Y1,X2,Y2}если требуется X1 != X2, требуется гарантия X1 < X2, в противном случае требуется гарантия Y1 <= Y2.

Если существует несколько прямых линий, одновременно отвечающих требованиям, выберите для расчета и возврата ту линию с наибольшим наклоном (прямая линия, параллельная оси Y, считается имеющей бесконечный наклон).

Пример:

входить:
квадрат1 = {-1, -1, 2}
квадрат2 = {0, -1, 2}
Вывод: {-1,0,2,0}
 Объяснение: Прямая y = 0 может одновременно разделить два квадрата на две части равной площади, а конечные точки возвращенных двух отрезков равны [-1,0 ] и [2,0]

намекать:

  • square.length == 3
  • square[2] > 0

Решение: Прежде всего, мы должны знать, что прямая линия, разделяющая два квадрата пополам, — это прямая линия, проходящая через центры двух квадратов, а затем вычислить 4 точки пересечения. Просто найдите четыре самые дальние точки пересечения. Следует отметить, что точка пересечения должна находиться на длине стороны квадрата, поэтому при расчете точки пересечения возникает вопрос, следует ли брать значение X или значение Y. После анализа чертежа, когда наклон находится в диапазоне от -1 до 1, возьмите значение X, а в других случаях — значение Y.

Итак, код выглядит следующим образом:

class Solution {
public:
    vector<double> cutSquares(vector<int>& square1, vector<int>& square2) {
        double x1=square1[0]+square1[2]/2.0;
        double y1=square1[1]+square1[2]/2.0;

        double x2=square2[0]+square2[2]/2.0;
        double y2=square2[1]+square2[2]/2.0;

        if(x1==x2)
        {
            return {x1,(double)min(square1[1],square2[1]),x1,(double)max(square1[1]+square1[2],square2[1]+square2[2])};
        }
        else
        {
            double jieju=1.0*(x1*y2-x2*y1)/(double)(x1-x2);
            double K=(y1-y2)/(x1-x2);
            if(K>=-1 && K<=1)
            {
                double retx1=min(square1[0],square2[0]);
                double rety1=(y1-y2)/(x1-x2)*retx1+jieju;

                double retx2=max(square1[0]+square1[2],square2[0]+square2[2]);
                double rety2=(y1-y2)/(x1-x2)*retx2+jieju;
                return {retx1,rety1,retx2,rety2};
            }
            else
            {
                if(K<-1)
                {
                    double rety1=max(square1[1]+square1[2],square2[1]+square2[2]);
                    double retx1=(rety1-jieju)/K;

                    double rety2=min(square1[1],square2[1]);
                    double retx2=(rety2-jieju)/K;
                    return {retx1,rety1,retx2,rety2};
                }
                else
                {
                    double rety2=max(square1[1]+square1[2],square2[1]+square2[2]);
                    double retx2=(rety2-jieju)/K;

                    double rety1=min(square1[1],square2[1]);
                    double retx1=(rety1-jieju)/K;
                    return {retx1,rety1,retx2,rety2};
                } 
            }
        }
    }
};

время 0 мс

бить

100%

ОЗУ 8 МБ

бить

97,9%

Supongo que te gusta

Origin blog.csdn.net/weixin_41579872/article/details/128356096
Recomendado
Clasificación