LeetCode演算法個人解答——939.最小面積矩形
阿新 • • 發佈:2018-12-21
題目
給定在 xy 平面上的一組點,確定由這些點組成的矩形的最小面積,其中矩形的邊平行於 x 軸和 y 軸。
如果沒有任何矩形,就返回 0。
示例 1:
輸入:[[1,1],[1,3],[3,1],[3,3],[2,2]]
輸出:4
示例 2:
輸入:[[1,1],[1,3],[3,1],[3,3],[4,1],[4,3]]
輸出:2
提示:
1 <= points.length <= 500
0 <= points[i][0] <= 40000
0 <= points[i][1] <= 40000
所有的點都是不同的。
解(執行時間2180ms)
解題思路
- 由於題目是剛出來的,所以查不到其他的解
- 矩形需要取四個點
- 由於矩形的邊平行於 x 軸和 y 軸,所以矩形的三個相鄰點是互相聯絡的
- 取對角,[x1, y1] 和 [x2, y2],這樣另外兩個點就是 [x1, y2] 和 [x2, y1]
- 可以自己畫一個座標系,這樣可以方便找出規律
class Solution:
def minAreaRect(self, points):
"""
:type points: List[List[int]]
:rtype: int
"""
# 將座標轉換成元組,並存入字典中
dic = set( [tuple(x) for x in points])
# 獲得點的個數
n = len(points)
# 限制最大值
res = 40001 * 40000
# 迴圈取點
for i in range(n):
# 儲存點的x軸和y軸的座標
x1, y1 = points[i]
# 迴圈取其他點
for j in range(i):
# 儲存點的x軸和y軸的座標
x2, y2 = points[j]
# 判讀點1的x和點2的y 以及 點1的y和點2的x是否不同
if x2 != x1 and y2 != y1:
# 判斷反轉後的兩個點是否都在集合中
if (x2, y1) in dic and (x1, y2) in dic:
# 計算矩形的面積,並與 res 比較大小,取最小值
res = min(res, abs(y2 - y1) * abs(x2 - x1))
if res != 40001 * 40000:
# 如果 res 改變了,則返回結果 res
return res
# 如果 res 沒改變,則沒有矩形
return 0