LeetCode 610. 判断三角形
题目描述


题意分析
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'的行。
解题步骤
- 从
Triangle逐行取出x、y、z,原样放入结果。- 在
CASE WHEN中用AND连接三条严格三角不等式。- 成立时返回
'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. 三角形的最大周长 | 简单 | 同样应用三角形不等式,原题排序后寻找最大周长,本题只判断是否可构成。 |
转载与许可
许可
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!