日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[Leedcode][JAVA][面试题 16.03. 交点]

發(fā)布時(shí)間:2023/12/10 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Leedcode][JAVA][面试题 16.03. 交点] 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

【問題描述】面試題 16.03. 交點(diǎn)

給定兩條線段(表示為起點(diǎn)start = {X1, Y1}和終點(diǎn)end = {X2, Y2}),如果它們有交點(diǎn),請計(jì)算其交點(diǎn),沒有交點(diǎn)則返回空值。要求浮點(diǎn)型誤差不超過10^-6。若有多個(gè)交點(diǎn)(線段重疊)則返回 X 值最小的點(diǎn),X 坐標(biāo)相同則返回 Y 值最小的點(diǎn)。

【解答思路】

https://leetcode-cn.com/problems/intersection-lcci/solution/jiao-dian-by-leetcode-solution/
需要認(rèn)真考慮所有情況!
聯(lián)立方程各種優(yōu)化!

1. 時(shí)間復(fù)雜度:O(1) 空間復(fù)雜度: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 {// 聯(lián)立方程得到 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. 時(shí)間復(fù)雜度:O(N) 空間復(fù)雜度:O(1)

【總結(jié)】

1. 編程需要一定的數(shù)學(xué)基礎(chǔ),思維要有廣度和深度
2. 善于封裝函數(shù)

總結(jié)

以上是生活随笔為你收集整理的[Leedcode][JAVA][面试题 16.03. 交点]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。