1. 程式人生 > >LeetCode演算法個人解答——939.最小面積矩形

LeetCode演算法個人解答——939.最小面積矩形

題目

給定在 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)

解題思路

  1. 由於題目是剛出來的,所以查不到其他的解
  2. 矩形需要取四個點
  3. 由於矩形的邊平行於 x 軸和 y 軸,所以矩形的三個相鄰點是互相聯絡的
  4. 取對角,[x1, y1] 和 [x2, y2],這樣另外兩個點就是 [x1, y2] 和 [x2, y1]
  5. 可以自己畫一個座標系,這樣可以方便找出規律
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