Facebook 面試題 | 凸多邊形

九章演算法發表於2017-08-08

專欄 | 九章演算法
網址 | www.jiuzhang.com

題目描述

給定一個包含多邊形頂點的List,List內的點按順序排列(順時針或逆時針),判斷這個多邊形是否是凸多邊形(凸多邊形的定義:如果把一個多邊形的所有邊中,有一條邊向兩方無限延長成為一直線時,其他各邊都在此直線的同旁,那麼這個多邊形就叫做凸多邊形。
可看詳細說明:en.wikipedia.org/wiki/Convex…

注:
1.點的個數在3到10000之間。
2.座標範圍[-10000,10000]。
3.你可以假設這個多邊形是一個簡單多邊形,換句話說,我們確保在每個頂點上恰好有兩條邊相交,並且邊彼此不會相交。

樣例

Example 1:

輸入:[[0,0],[0,1],[1,1],[1,0]]

輸出:True

樣例解釋:

Example 2:

輸入:[[0,0],[0,10],[10,10],[10,0],[5,5]]

輸出:False

樣例解釋:

解題思路

a. 這題是一題幾何題,給定一系列的點判斷是否是凸多邊形,根據凸多邊形的定義,我們很容易就可以想到判斷所有的點是不是在任意一條邊的同旁即可,這麼做的時間複雜度是O(n^2),對於這題的資料範圍來說很低效。

b. 由於這題給出的多邊形是一個簡單多邊形,因此我們不需要考慮邊互相交叉的情況,所以我們可以直接判斷這個多邊形的每一個內角大小,若均小於(本題中可以等於)180度,則為凸多邊形。

c. 判斷兩條邊的夾角我們可以用向量的叉積來計算,二維向量A與向量B的叉積可以表示為|A×B|=AxBy-AyBx,若這個值大於0,則說明B指向A逆時針旋轉0到180的方向,若這個值小於0,則說明B指向A順時針旋轉0到180的方向,若等於0,則兩向量共線。根據向量的叉積我們就可以判斷這個多邊形的內角是否均小於180度,相鄰兩條邊的向量均保持順時針或逆時針旋轉才符合條件。

d.需要注意的是,我們需要額外判斷一下(n-1,n)×(n,0)和(n,0)×(0,1)這兩個叉積。並且叉積為0(即相鄰的邊共線,但不包括所有點共線)在本題中是可以被接受的。

參考程式

面試官角度分析

本題是一道平面幾何題,需要了解一些幾何的知識,難點是把向量的方向判斷轉化為叉積運算。同時需要考慮corner case(叉積為0,最後幾條邊的判斷)。本題是中等偏簡單難度的題,正確完成程式並處理好corner case可達到hire的評價。

題目答案連結

www.jiuzhang.com/solution/co…

相關題目

www.lintcode.com/zh-cn/probl…


推薦閱讀:



歡迎關注我的微信公眾號:九章演算法(ninechapter)。
精英程式設計師交流社群,定期釋出面試題、面試技巧、求職資訊等

九章演算法,IT教育領域的深耕者
九章演算法,IT教育領域的深耕者

相關文章