题目描述

✅ 610. 判断三角形

image-20260928224343586

image-20260928224343587

题意分析

Triangle 表的每一行给出三条边 x、y、z。保留这些边长,并增加一列 triangle:能组成三角形时返回 'Yes',否则返回 'No'。每行独立判断,不需要汇总或筛掉不合法的行。

解法:SQL 查询建模

核心思路

[!blue]

三条边能围成三角形,当且仅当任意两边之和都严格大于第三边。等于时三条边只能落在一条直线上,因此比较符必须是 >。

输入没有保证哪一列是最长边,所以同时判断 x + y > z、x + z > y、y + z > x,用 AND 要求三式全部成立。这样无论最长边位于哪一列,都会检查到它能否被另外两边围住。

题目要给每一行打标签,因此在 SELECT 中使用 CASE:条件成立输出 'Yes',否则输出 'No',并把这一列命名为 triangle。不使用 WHERE 过滤,才能保留需要输出 'No' 的行。

解题步骤

  1. 从 Triangle 逐行取出 x、y、z,原样放入结果。
  2. 在 CASE WHEN 中用 AND 连接三条严格三角不等式。
  3. 成立时返回 'Yes',否则返回 'No',将派生列命名为 triangle。

代码实现

-- 保留原表每一行,在投影中追加判定标签
SELECT
    x,
    y,
    z,
    CASE
        -- 三条边没有排序保证,严格不等式必须同时成立
        WHEN x + y > z AND x + z > y AND y + z > x THEN 'Yes'
        ELSE 'No'
    END AS triangle
FROM Triangle;

复杂度分析

  • 时间复杂度:按单次扫描模型为 $O(r)$,r 为行数,每行常数计算。
  • 空间复杂度:逐行计算只需常数状态;结果集为线性规模,实际缓冲由数据库执行方式决定。

关键点总结

[!green]

  • 判定在每行内部完成,既不需要分组,也不改变原行的三条边。
  • CASE 产生分类结果,三条条件同时满足才是 'Yes'。
  • 题目不限制结果行顺序,因此不需要额外排序。

易错点总结

[!yellow]

  • 使用 >= 会把退化成直线的情况判为三角形。
  • 三个条件用 OR 连接,会接受只满足部分不等式的组合。
  • 默认 z 最大而只检查 x + y > z,无法覆盖最长边在其他列的情况。
  • 在 WHERE 中放入判定条件,会丢掉本应输出 'No' 的行。

相似题目

题目 难度 关联与区别
611. 有效三角形的个数 中等 三角形两边和大于第三边的条件相同,原题从数组中统计所有合法三元组,本题验证每行给定的三边。
976. 三角形的最大周长 简单 同样应用三角形不等式,原题排序后寻找最大周长,本题只判断是否可构成。
转载与许可
作者
链接 https://hgnulb.github.io/blog/2025/92076078
许可 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!