面试题 16.13. 平分正方形

面试题 16.13. 平分正方形

给定两个正方形及一个二维平面。请找出将这两个正方形分割成两半的一条直线。假设正方形顶边和底边与 x 轴平行。

每个正方形的数据square包含3个数值,正方形的左下顶点坐标[X,Y] = [square[0],square[1]],以及正方形的边长square[2]。所求直线穿过两个正方形会形成4个交点,请返回4个交点形成线段的两端点坐标(两个端点即为4个交点中距离最远的2个点,这2个点所连成的线段一定会穿过另外2个交点)。2个端点坐标[X1,Y1]和[X2,Y2]的返回格式为{X1,Y1,X2,Y2},要求若X1 != X2,需保证X1 < X2,否则需保证Y1 <= Y2。

若同时有多条直线满足要求,则选择斜率最大的一条计算并返回(与Y轴平行的直线视为斜率无穷大)。

示例:

输入:
square1 = {-1, -1, 2}
square2 = {0, -1, 2}
输出: {-1,0,2,0}
解释: 直线 y = 0 能将两个正方形同时分为等面积的两部分,返回的两线段端点为[-1,0]和[2,0]
提示:

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

方法1:分情况讨论+算斜率计算

20210610100151709

        public double[] cutSquares(int[] square1, int[] square2) {
            //计算两个正方形的中心点 center
            int x1 = square1[0], y1 = square1[1], h1 = square1[2];
            int x2 = square2[0], y2 = square2[1], h2 = square2[2];
            double[] c1 = new double[]{x1 + h1 / 2.0, y1 + h1 / 2.0};
            double[] c2 = new double[]{x2 + h2 / 2.0, y2 + h2 / 2.0};
            double[] res = new double[4];
            //中心点重合 || 直线斜率为无穷大,即与x轴垂直,与y轴平行
            if (c1[0] == c2[0]) {
                res[0] = c1[0];
                res[1] = Math.min(y1, y2);//取两个正方形的最下面的一条边的最小y坐标
                res[2] = c2[0];
                //取两个正方形的最上面的一条边的最大y坐标
                res[3] = Math.max(y1 + h1, y2 + h2);
                return res;
            }
            //斜率
            double k = (c2[1] - c1[1]) / (c2[0] - c1[0]);
            if (Math.abs(k) < 1) {//小于1的情况,与左右的四条边相交
                //left right
                double lx = Math.min(x1, x2);
                double rx = Math.max(x1 + h1, x2 + h2);
                double ly = c1[1] - k * (c1[0] - lx);
                double ry = c1[1] - k * (c1[0] - rx);
                return new double[]{lx, ly, rx, ry};
            } else {//大于1的情况,与上下的四条边相交
                //down up
                double dy = Math.min(y1, y2);
                double uy = Math.max(y1 + h1, y2 + h2);
                double dx = c1[0] - (c1[1] - dy) / k;
                double ux = (uy - c1[1]) / k + c1[0];
                return dx < ux ? new double[]{dx, dy, ux, uy} : new double[]{ux, uy, dx, dy};
            }
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值