当前位置: 首页 > article >正文

LeetCode 面试题 16.03. 交点

文章目录

  • 一、题目
  • 二、C# 题解

一、题目

  给定两条线段(表示为起点 start = {X1, Y1} 和终点 end = {X2, Y2}),如果它们有交点,请计算其交点,没有交点则返回空值。

  要求浮点型误差不超过 10^-6。若有多个交点(线段重叠)则返回 X 值最小的点,X 坐标相同则返回 Y 值最小的点。

示例 1:

输入:
line1 = {0, 0}, {1, 0}
line2 = {1, 1}, {0, -1}
输出: {0.5, 0}

示例 2:

输入:
line1 = {0, 0}, {3, 3}
line2 = {1, 1}, {2, 2}
输出: {1, 1}

示例 3:

输入:
line1 = {0, 0}, {1, 1}
line2 = {1, 0}, {2, 1}
输出: {},两条线段没有交点

提示:

  • 坐标绝对值不会超过 2^7
  • 输入的坐标均是有效的二维坐标

  点击此处跳转题目。

二、C# 题解

  这题写的心累,参考了 LeetCode 官方解法,代码如下:

public class Solution {
    public double[] Intersection(int[] start1, int[] end1, int[] start2, int[] end2) {
        int       xa  = start1[0], xb = end1[0], xc = start2[0], xd = end2[0];
        int       ya  = start1[1], yb = end1[1], yc = start2[1], yd = end2[1];
        double[] ans = { };

        if ((xa - xb) * (yc - yd) != (ya - yb) * (xc - xd)) { // 不平行
            int    r = (xd - xc) * (yb - ya) - (yd - yc) * (xb - xa);
            int    p = (xc - xa) * (yd - yc) - (yc - ya) * (xd - xc);
            int    q = (xa - xc) * (yb - ya) - (ya - yc) * (xb - xa);
            double m = p * -1.0 / r, n = q * 1.0 / r;
            if (0 <= m && m <= 1 && 0 <= n && n <= 1) 
                ans = new[] { xa + (xb - xa) * m, ya + (yb - ya) * m };
            
        }
        else if ((xa - xb) * (yc - ya) == (ya - yb) * (xc - xa)) { // 平行且在一条直线上
            Operation(xa, ya, xc, yc, xd, yd, ref ans);
            Operation(xb, yb, xc, yc, xd, yd, ref ans);
            Operation(xc, yc, xa, ya, xb, yb, ref ans);
            Operation(xd, yd, xa, ya, xb, yb, ref ans);
        }

        return ans;
    }

    private void Operation(int xp, int yp, int xa, int ya, int xb, int yb, ref double[] ans) {
        if (xp == xa && InLine(yp, ya, yb)) Update(xp, yp, ref ans);
        else if (xp != xa && InLine(xp, xa, xb)) Update(xp, yp, ref ans);
    }

    private bool InLine(int p, int a, int b) {
        return a <= p && p <= b || b <= p && p <= a;
    }

    private void Update(int x, int y, ref double[] ans) {
        if (ans.Length == 0) ans = new double[] { x, y };
        else if (Math.Abs(x - ans[0]) < 1e-6) ans[1] = y < ans[1] ? y : ans[1];
        else if (x < ans[0]) {
            ans[0] = x;
            ans[1] = y;
        }
    }
}
  • 时间:124 ms,击败 66.67% 使用 C# 的用户
  • 内存:41.04 MB,击败 100.00% 使用 C# 的用户

http://www.kler.cn/a/106611.html

相关文章:

  • 单片机智能家居火灾环境安全检测
  • cache中setID和index
  • 【全面系统性介绍】虚拟机VM中CentOS 7 安装和网络配置指南
  • 让空间计算触手可及,VR手套何以点石成金?
  • JVM双亲委派与自定义类加载器
  • 深度解析 Feign
  • clang-前端插件-给各种无花括号的“块”加花括号-基于llvm15--clang-plugin-add-brace
  • STM32:TTL串口调试
  • 计算机操作系统重点概念整理-第二章 进程管理【期末复习|考研复习】
  • 【ModbusTCP协议】
  • Spring Authorization Server 1.1 扩展实现 OAuth2 密码模式与 Spring Cloud 的整合实战
  • C++数据结构X篇_21_插入排序(稳定的排序)
  • FPGA与人工智能泛谈-01
  • 第五天:前端页面展示不出来
  • 分布式消息队列:Rabbitmq(2)
  • Ant Design Pro【面包屑导航】二级路由和三级路由都有component的情况,三级不显示component的页面,怎么解决?
  • matlab simulink 四旋翼跟拍无人机仿真
  • Non-constant range: argument must be an integer literal
  • vue3中刷新当前页面的三种方法
  • 简述一下伪共享的概念以及如何避免
  • 记录:获取windows当前登录的用户信息
  • R语言的物种气候生态位动态量化与分布特征模拟实践技术
  • P1868 饥饿的奶牛
  • 2023深耕kotlin,谈谈前景
  • webgl速记之如何根据用户硬件进行性能模式OR质量模式的切换的设计思路
  • Jetpack:019-Jetpack的导航二(传递数据)