Python Brush LeetCode:インタビューの質問16.03。交差

難易度:難易度

タイトルの説明:

给定两条线段(表示为起点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
  • 输入的坐标均是有效的二维坐标

問題解決のアイデア:

アイデア1:多項式を使用して線の交点を解きます。縦線に注意してください。

アイデア2:ソリューションを横断するために二分法を使用します:https://leetcode-cn.com/problems/intersection-lcci/solution/py3er-fen-cha-zhao-fa-si-lu-lai-yuan-yu-zuo -tian-d /

問題解決コード:

 私はアイデア1を使用します。 

class Solution:
     def intersection(self、start1:List [int]、end1:List [int]、start2:List [int]、end2:List [int])-> List [float]:
        orig_x1 = [min(start1 [ 0]、end1 [0])、max(start1 [0]、end1 [0])]   line1 x値の範囲 
        orig_x2 = [min(start2 [0]、end2 [0])、max(start2 [0 ]、END2 [0])]   LINE2範囲内のxの 
        final_x = [MAX(orig_x1 [0]、orig_x2 [0])、分(orig_x1 [1]、orig_x2 [1])]   2ラインマージX値の範囲の後、final_x [0]> final_x [1]の場合、2つの線xに交差がないこと、および線に交差点がないことを意味します 
        orig_y1 = [min(start1 [1]、end1 [1])、max(start1 [ 1]、end1 [1 ])] 
        orig_y2 = [min(start2 [1]、end2 [1])、max(start2 [1]、end2 [1 ])]
        final_y = [max(orig_y1 [0]、orig_y2 [0])、min(orig_y1 [1]、orig_y2 [1 ])] 

        line1垂直、line2不垂直
        if start1 [0] == end1 [0] および start2 [ 0]!= end2 [0]:
            x = start1 [0] 
            y =(end2 [1]-start2 [1])*(x-start2 [0])/(end2 [0]-start2 [0])+ start2 [1 ] 
            rt = [x、y]
         line2垂直、line1不垂直
        elif start1 [0]!= end1 [0] and start2 [0] == end2 [0]:
            x = start2 [0] 
            y =(end1 [1]-start1 [1])*(x-start1 [0])/(end1 [0]-start1 [0])+ start1 [1 ]
            RT = [X、Y]
         LINE1、LINE2垂直
        ELIF START1 [0] == END1 [0]  START2 [0] == END2 [0]:   2である場合、垂直
            IF START1 [0]! START2 = [0]:  2行が一致しない場合は 
                RT = []
             他の2破線が一致した場合、交差点があるか否かを判断します。
                x = start1 [0]
                 if final_y [0] <= final_y [1 ]:
                    rt = [float(x)、float(final_y [0])]
                 else 
                    rt = []
          LINE1、LINE2ない垂直の
        
            A1 =([1] - [1] START1 END1)/(START1 [0] - END1 [0])
            B1 = START1 [1] - A1 * START1 [0 ] 
            A2 =(START2 [1] - 。END2 [1])/(START2 [0] - END2 [0])
            B2 = START2 [1] - 。A2 * START2 [0]
             IF A1 = A2 :!   ラインの傾き不等 
                x =(b2-b1)/(a1- a2)
                y = a1 * x + b1
                 if if x> = final_x [0] and x <= final_x [1]:  あるか否かを判定する線分説明 
                    RT = [フロート(X)、フロート(Y)]
                 
                    RT = []
             #1 行傾きが等しく
                IF:B1とB2 ==   セグメントが重複する場合、最小点xを取ります。xの最小点が同じ
                    場合、 final_x [0] <= final_x [1 ]の場合、yの最小値を持つ点が返されます:
                        x = final_x [0] 
                        y = a1 * x + b1 
                        rt = [x、y]
                     else 
                        rt = [ ]
                 その他
                    rt = []
         rtを返す

 

给定两条线段(表示为起点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
  • 输入的坐标均是有效的二维坐标

問題解決のアイデア:

アイデア1:多項式を使用して線の交点を解きます。縦線に注意してください。

アイデア2:ソリューションを横断するために二分法を使用します:https://leetcode-cn.com/problems/intersection-lcci/solution/py3er-fen-cha-zhao-fa-si-lu-lai-yuan-yu-zuo -tian-d /

問題解決コード:

おすすめ

転載: www.cnblogs.com/jaysonteng/p/12686652.html