【问题描述】面试题 16.03. 交点

给定两条线段(表示为起点start = {X1, Y1}和终点end = {X2, Y2}),如果它们有交点,请计算其交点,没有交点则返回空值。要求浮点型误差不超过10^-6。若有多个交点(线段重叠)则返回 X 值最小的点,X 坐标相同则返回 Y 值最小的点。

【解答思路】

https://leetcode-cn.com/problems/intersection-lcci/solution/jiao-dian-by-leetcode-solution/
需要认真考虑所有情况!
联立方程各种优化!

1. 时间复杂度:O(1) 空间复杂度:O(1)
class Solution {public double[] intersection(int[] start1, int[] end1, int[] start2, int[] end2) {int x1 = start1[0], y1 = start1[1];int x2 = end1[0], y2 = end1[1];int x3 = start2[0], y3 = start2[1];int x4 = end2[0], y4 = end2[1];double[] ans = new double[2];Arrays.fill(ans, Double.MAX_VALUE);// 判断两直线是否平行if ((y4-y3)*(x2-x1) == (y2-y1)*(x4-x3)) {// 判断两直线是否重叠if ((y2-y1)*(x3-x1) == (y3-y1)*(x2-x1)) {// 判断 (x3, y3) 是否在「线段」(x1, y1)~(x2, y2) 上if (isInside(x1, y1, x2, y2, x3, y3)) {updateRes(ans, x3, y3);}// 判断 (x4, y4) 是否在「线段」(x1, y1)~(x2, y2) 上if (isInside(x1, y1, x2, y2, x4, y4)) {updateRes(ans, (double)x4, (double)y4);}// 判断 (x1, y1) 是否在「线段」(x3, y3)~(x4, y4) 上if (isInside(x3, y3, x4, y4, x1, y1)) {updateRes(ans, (double)x1, (double)y1);}// 判断 (x2, y2) 是否在「线段」(x3, y3)~(x4, y4) 上if (isInside(x3, y3, x4, y4, x2, y2)) {updateRes(ans, (double)x2, (double)y2);}}} else {// 联立方程得到 t1 和 t2 的值double t1 = (double)(x3 * (y4 - y3) + y1 * (x4 - x3) - y3 * (x4 - x3) - x1 * (y4 - y3)) / ((x2 - x1) * (y4 - y3) - (x4 - x3) * (y2 - y1));double t2 = (double)(x1 * (y2 - y1) + y3 * (x2 - x1) - y1 * (x2 - x1) - x3 * (y2 - y1)) / ((x4 - x3) * (y2 - y1) - (x2 - x1) * (y4 - y3));// 判断 t1 和 t2 是否均在 [0, 1] 之间if (t1 >= 0.0 && t1 <= 1.0 && t2 >= 0.0 && t2 <= 1.0) {ans[0] = x1 + t1 * (x2 - x1);ans[1] = y1 + t1 * (y2 - y1);}}if (ans[0] == Double.MAX_VALUE) {return new double[0];}return ans;}// 判断 (x, y) 是否在「线段」(x1, y1)~(x2, y2) 上// 这里的前提是 (x, y) 一定在「直线」(x1, y1)~(x2, y2) 上private boolean isInside(int x1, int y1, int x2, int y2, int x, int y) {// 若与 x 轴平行,只需要判断 x 的部分// 若与 y 轴平行,只需要判断 y 的部分// 若为普通线段,则都要判断return (x1 == x2 || (Math.min(x1, x2) <= x && x <= Math.max(x1, x2)))&& (y1 == y2 || (Math.min(y1, y2) <= y && y <= Math.max(y1, y2)));}private void updateRes(double[] ans, double x, double y) {if (x < ans[0] || (x == ans[0] && y < ans[1])) {ans[0] = x;ans[1] = y;}}
}
2. 时间复杂度:O(N) 空间复杂度:O(1)

【总结】

1. 编程需要一定的数学基础,思维要有广度和深度
2. 善于封装函数

[Leedcode][JAVA][面试题 16.03. 交点]相关推荐

  1. 程序员面试金典 - 面试题 16.03. 交点(数学)

    1. 题目 给定两条线段(表示为起点start = {X1, Y1}和终点end = {X2, Y2}),如果它们有交点,请计算其交点,没有交点则返回空值. 要求浮点型误差不超过10^-6.若有多个交 ...

  2. [Leedcode][JAVA][面试题 16.18][模式匹配][字符串][枚举]

    [问题描述][中等] 你有两个字符串,即pattern和value. pattern字符串由字母"a"和"b"组成,用于描述字符串中的模式.例如,字符串&quo ...

  3. Java面试题16 牛客 以下java程序代码,执行后的结果是()

    Java面试题16 牛客 以下java程序代码,执行后的结果是() 1 2 3 4 5 6 7 8 9 10 public class Test {     public static void ma ...

  4. [Leedcode][JAVA][面试题 08.11][硬币][动态规划]

    [问题描述] 面试题 08.11.硬币 硬币.给定数量不限的硬币,币值为25分.10分.5分和1分,编写代码计算n分有几种表示法.(结果可能会很大,你需要将结果模上1000000007)示例1:输入: ...

  5. [Leedcode][JAVA][面试题 01.07][找规律][旋转数组]

    [问题描述] [面试题 01.07. 旋转矩阵] 示例 1:给定 matrix = [[1,2,3],[4,5,6],[7,8,9] ],原地旋转输入矩阵,使其变为: [[7,4,1],[8,5,2] ...

  6. [剑指offer][JAVA]面试题第[03]题[数组中的重复数字][HashSet]

    [问题描述][数组中的重复数字][简单] 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道 ...

  7. 《程序员面试金典(第6版)》面试题 16.13. 平分正方形(直线的斜截式方程,C++)

    题目描述 给定两个正方形及一个二维平面.请找出将这两个正方形分割成两半的一条直线.假设正方形顶边和底边与 x 轴平行. 每个正方形的数据square包含3个数值,正方形的左下顶点坐标[X,Y] = [ ...

  8. 歌谣带你看java面试题

    面试题来源与各个网站,如有不合理之处,欢迎吐槽. 第一题.java面试题1 牛客:A派生出子类B,B派生出子类C,并且在java源代码中有如下声明: 第二题.java面试题2 牛客:定义类中成员变量时 ...

  9. Java面试题全集84集系列-(1-XX)

    (1)不要说自己擅长某方面,说自己熟悉或者对某一方面有所研究. java 基础 (2) java 跨平台原理https://www.cnblogs.com/roger-yu/p/5827452.htm ...

最新文章

  1. sql server 按时间段查询
  2. 怎么算 实体识别_大篷车流动摆摊卖日用品月赚万元,大商场生意冷清,实体店不好做...
  3. 山寨今日头条的标题title效果
  4. unzipping/Users/xq/.gradle/wrapper /dists/gradle-3.3-all/55gk2rcmfc6p2dg9u9ohc3hw9/gradle-3.3-all.zi
  5. 解决import tensorflow时的报错 Passing (type, 1) or ‘1type‘ as a synonym of type is deprecate
  6. Python Twisted 介绍
  7. play 应用商店_如何在Play商店中发布应用程序
  8. python数据库mysql_python数据库(mysql)操作
  9. oracle if 语句的使用
  10. Windows部署WSUS补丁服务器
  11. 计算机攻击方式有哪些,常用的dos攻击方式是什么
  12. 数学专业英语 -- 期望、方差、中心极限定理
  13. 使用Bugly 作为APP异常上报工具
  14. 如何将自己网络计算机更名,如何将自己的win7电脑变身wifi无线网络热点
  15. FileNotFoundException: http:\localhos46087125.jpg (文件名、目录名或卷标语法不正确
  16. 人工智能之Python人脸对比、人脸检测
  17. VBA 汇总指定文件夹下的Excel文件数据
  18. 手机通过adb工具安装应用
  19. ENVI:标准库中光谱(.sli)重采样
  20. 微信公众平台SDK! Senparc.Weixin.MP.dll(资料整理)

热门文章

  1. UIProgressView-初识IOS
  2. USACO / Cow Pedigrees(DP)
  3. java 将json转成utf 8_解决JSON.stringify()自动将中文转译成unicode的方法
  4. spring 多线程 事务的实际应用场景
  5. @ResponseBody ResponseEntity
  6. android.os.BinderProxy cannot be cast to
  7. js 数字千分位展示
  8. HTML元素参考手册 HTML Elements Reference
  9. java面向_java是面向什么的语言?
  10. vbs当计算机重启,用vbs实现重新启动 Internet Explorer