幾何應用: 最多有幾個點共線? Max Points on a Line_Leetcode #149

閱讀時間約 6 分鐘

題目敘述 149. Max Points on a Line


給定一串2維平面的點座標,請問最多有幾個點落在同一條直線上?

落在同一條直線也就是數學上所謂的"共線" colinear


測試範例

Example 1:

raw-image
Input: points = [[1,1],[2,2],[3,3]]
Output: 3


Example 2:

raw-image


Input: points = [[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]]
Output: 4

約束條件

Constraints:

  • 1 <= points.length <= 300

做少一個給一個點座標,最多給300個點座標。

  • points[i].length == 2

點座標落在xy平面上,第一個欄位是x座標,第二個欄位是y座標。

  • -10^4 <= xi, yi <= 10^4

x座標, y座標都落在正負一萬以內的區間。

  • All the points are unique.

所有的點座標都不重複。


觀察


任意兩點必共線。(因為任意不同的兩點肯定構成一條直線)

若要更多點的共線,則必須彼此的斜率相同!

raw-image



演算法 計算有多少組斜率相同的連線


如果一群點座標共線,那麼他們倆兩之間的斜率一定都相同。


建立一個字典,掃描過每個兩兩一組點座標,統計斜率相同的次數。

斜率相同次數最多的那組,就是擁有最多點座標共線

最後返回共線的點座標數量即可。


程式碼 計算有多少組斜率相同的連線

class Solution:

# member method to compute greatest common factor
def gcd(self, x, y):
if y == 0 :
return x
else:
return self.gcd( y, x % y )

def maxPoints(self, points: List[List[int]]) -> int:

# total number of 2D points
size = len( points )

# to sotre the maximum number of colonear 2D points
max_num_of_points_colinear = 0

for i in range( size ):

## Dictionary:
# key: (x_delta, y_delta)
# vluae: number of colinear pointer with slope = y_delta / x_delta
on_the_same_line = defaultdict( int )

repeated_2D_point = 1

# get coordinate of 2D Point i
x_of_point_i = points[i][0]
y_of_point_i = points[i][1]

for j in range(i+1, size):

# get coordinate of 2D Point j
x_of_point_j = points[j][0]
y_of_point_j = points[j][1]

delta_x = x_of_point_i - x_of_point_j
delta_y = y_of_point_i - y_of_point_j

# get greatest common factor
factor = self.gcd( delta_x, delta_y )

# simplify to irreducible fraction
delta_x /= factor
delta_y /= factor

# update the number of colinear 2D point
#
on_the_same_line[(delta_x, delta_y)] += 1

#----------------------------------------------------
current_max_num_pt_colinear = 1

# get the max number of colinear points
if len( on_the_same_line ) != 0:
current_max_num_pt_colinear = max( on_the_same_line.values() ) + 1

# update the global max number of colinear points
max_num_of_points_colinear = max( max_num_of_points_colinear, current_max_num_pt_colinear)

return max_num_of_points_colinear

複雜度分析

時間複雜度: O(n^2)

總共有C(n, 2)個點座標pair,掃描這些點座標pair,計算斜率,統計斜率的相同次數。


空間複雜度: O(n)

需要建立一個字典去儲存斜率。

最差情況下,每個pair的斜率都不相同。


Reference

[1] Max Points on a Line - LeetCode

80會員
415內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
題目敘述: 給定一個二維陣列的高與寬,並且給定起點位置座標。 請從起點位置開始順時針拜訪陣列元素,並且把沿路走過的座標記錄下來。 以陣列的形式返回答案。
題目敘述 Integer to English Words 給定一個整數num 請轉換成對應的的英文數字表達(One, Two, Three, ... 那種數字表達式)
題目敘述: 給定一個傳統手機鍵盤,如圖所示 接著給定一個字串word。 現在讓你重新安排每個字母的所在位置,每個字母可以重新安排到2~9這幾個鍵盤上的位置,每個字母限定只能選擇一個數字鍵去對應。 請問重新安排之後,最少要幾次按鍵才能輸出字串word?
題目敘述 Kth Distinct String in an Array 給定一個輸入陣列arr 和 參數k 請返回第k個出現恰好一次的陣列元素。
題目敘述 Make Two Arrays Equal by Reversing Subarrays 題目給定兩個輸入陣列,請問能否透過子陣列的反轉讓兩個陣列相等? 子陣列的反轉操作次數不受限制。 如果可以,返回True 如果不行,返回False
題目敘述 Number of Senior Citizens 給定一個旅客的車票字串陣列,美個字串的最後第四個和第三個數字代表旅客的年齡。 例如: XXX...XXX2015 代表旅客年齡為20歲。 總請計算共有多少位乘客的年齡 > 60 歲
題目敘述: 給定一個二維陣列的高與寬,並且給定起點位置座標。 請從起點位置開始順時針拜訪陣列元素,並且把沿路走過的座標記錄下來。 以陣列的形式返回答案。
題目敘述 Integer to English Words 給定一個整數num 請轉換成對應的的英文數字表達(One, Two, Three, ... 那種數字表達式)
題目敘述: 給定一個傳統手機鍵盤,如圖所示 接著給定一個字串word。 現在讓你重新安排每個字母的所在位置,每個字母可以重新安排到2~9這幾個鍵盤上的位置,每個字母限定只能選擇一個數字鍵去對應。 請問重新安排之後,最少要幾次按鍵才能輸出字串word?
題目敘述 Kth Distinct String in an Array 給定一個輸入陣列arr 和 參數k 請返回第k個出現恰好一次的陣列元素。
題目敘述 Make Two Arrays Equal by Reversing Subarrays 題目給定兩個輸入陣列,請問能否透過子陣列的反轉讓兩個陣列相等? 子陣列的反轉操作次數不受限制。 如果可以,返回True 如果不行,返回False
題目敘述 Number of Senior Citizens 給定一個旅客的車票字串陣列,美個字串的最後第四個和第三個數字代表旅客的年齡。 例如: XXX...XXX2015 代表旅客年齡為20歲。 總請計算共有多少位乘客的年齡 > 60 歲
你可能也想看
Thumbnail
八十-二十法則提到,在多數生活的現象中,約80%的效果是來自於20%的原因,除了經濟學、學習理論外,這個法則同樣也可以應用在生活中的幸福感上。 我們需要認知到擁有的越多不一定會越快樂,反而有可能會因為無法專注在少數事物上而產生空虛、迷茫的感覺。「極簡」精神最重要的一點在於放下對於「多」的執著,將有
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
給定兩個輸入整數陣列, 若在兩個陣列遇到相同的數字可以連成一線, 但是有規定連線不可和別的連線有交叉, 請問最多可以形成幾條連線? 解答中探討了演算法化簡的技巧和DP模型, 可以透過演算法化簡的技巧, 把這題映射到原本已經學會的Longest Common Subsequence的DP模型來解開。
Thumbnail
題目敘述 題目會給我們一串相鄰矩陣isConnected,相鄰矩陣的元素值isConnected[i][j] 代表第i座城市和第j座城市是否有連通。 如果彼此有連通,則isConnected[i][j]=1。 如果彼此沒有連通,則isConnected[i][j]=0。 彼此互相有路徑可以
Thumbnail
八十-二十法則提到,在多數生活的現象中,約80%的效果是來自於20%的原因,除了經濟學、學習理論外,這個法則同樣也可以應用在生活中的幸福感上。 我們需要認知到擁有的越多不一定會越快樂,反而有可能會因為無法專注在少數事物上而產生空虛、迷茫的感覺。「極簡」精神最重要的一點在於放下對於「多」的執著,將有
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
給定兩個輸入整數陣列, 若在兩個陣列遇到相同的數字可以連成一線, 但是有規定連線不可和別的連線有交叉, 請問最多可以形成幾條連線? 解答中探討了演算法化簡的技巧和DP模型, 可以透過演算法化簡的技巧, 把這題映射到原本已經學會的Longest Common Subsequence的DP模型來解開。
Thumbnail
題目敘述 題目會給我們一串相鄰矩陣isConnected,相鄰矩陣的元素值isConnected[i][j] 代表第i座城市和第j座城市是否有連通。 如果彼此有連通,則isConnected[i][j]=1。 如果彼此沒有連通,則isConnected[i][j]=0。 彼此互相有路徑可以