↓快轉到主要內容
  1. LeetCode/

LeetCode 3899: Angles of a Triangle

·1 分鐘· ·
LeetCode Medium Math Geometry
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2026-04-12

  • 提交紀錄:Wrong Answer → Accepted

解題思路
#

  1. 三角不等式:面積大於 0 ⇔ 任兩邊之和大於第三邊(嚴格大於;等於的話三點共線,面積是 0)。
  2. 餘弦定理:cos A = (b² + c² - a²) / (2bc),A = acos(cos A),轉成角度。
  3. 題目要求由小到大輸出。

我的嘗試
#

第一版角度算對了,但直接依 a, b, c 的順序回傳,沒有排序。例如 sides = [4, 4, 1]:回傳 [82.8, 82.8, 14.4],要的是 [14.4, 82.8, 82.8]。加上 sorted 就 AC 了。

正確解法
#

from math import acos, degrees

class Solution:
    def internalAngles(self, sides: List[int]) -> List[float]:
        a, b, c = sorted(sides)
        if a + b <= c:
            return []                              # 面積是 0 或組不成
        def angle(opp: int, x: int, y: int) -> float:
            cos_v = (x * x + y * y - opp * opp) / (2 * x * y)
            return degrees(acos(max(-1.0, min(1.0, cos_v))))   # 防止浮點誤差超出 [-1, 1]
        return sorted([angle(a, b, c), angle(b, a, c), angle(c, a, b)])

先排序的話,三角不等式只要檢查最短的兩邊之和是否大於最長邊。

複雜度
#

時間 O(1),空間 O(1)。

要特別避免的錯誤
#

  • 輸出要排序。
  • 三角不等式要嚴格大於。
  • acos 的參數可能因為浮點誤差稍微超出 [-1, 1],夾一下比較保險。

面試口說整理
#

先排序三邊,最短的兩邊之和要嚴格大於最長邊才是三角形。再用餘弦定理算三個角、轉成角度,最後排序輸出。時間 O(1)。

相關文章

LeetCode 1401: Circle and Rectangle Overlapping
·1 分鐘
LeetCode Medium Math Geometry
LeetCode 1401 解題筆記:矩形裡離圓心最近的點,是把圓心的座標 clamp 到矩形範圍內;這個點到圓心的距離 <= 半徑就重疊
LeetCode 973: K Closest Points to Origin
·1 分鐘
LeetCode Medium Array Math Divide-and-Conquer Geometry
LeetCode 973 解題筆記:跟 Top-K 一樣,用大小為 k 的 max-heap(存負的距離)保留最近的 k 個點
LeetCode 976: Largest Perimeter Triangle
·1 分鐘
LeetCode Easy Math Greedy Sorting Geometry Array
LeetCode 976 解題筆記:排序後,從最大的開始看連續的三條邊,a + b > c 第一次成立就是最大周長
LeetCode 633: Sum of Square Numbers
·2 分鐘
LeetCode Medium Two-Pointers Math Binary-Search
LeetCode 633 解題筆記:a 從 0、b 從 isqrt(c) 開始對撞;平方和太大 b 減一,太小 a 加一;注意 0 也算、a 可以等於 b、浮點數開根號的誤差
LeetCode 3824: Minimum K to Reduce Array Within Limit
·1 分鐘
LeetCode Medium Binary-Search Math
LeetCode 3824 解題筆記:對 k 二分,條件是單調的;上界至少要到 n,因為操作次數至少是 n
LeetCode 3648: Minimum Sensors to Cover Grid
·1 分鐘
LeetCode Medium Math
LeetCode 3648 解題筆記:每個感測器蓋住 (2k + 1) × (2k + 1) 的正方形,兩個方向各自做無條件進位的除法再相乘