任意两点组成的矩形面积
LeetCode 1459 · 自连接、去重配对、排除退化情况
面试怎么回答
自连接 a.id < b.id,面积 = ABS(a.x - b.x) * ABS(a.y - b.y),过滤掉 x 或 y 相同的点对,按面积降序、p1、p2 升序排序。用小于号而不是不等号配对,既去重又满足 p1 < p2。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
题意
点表记录每个点的坐标。任意两点作为矩形的对角顶点,计算矩形面积;面积为 0(两点同一行或同一列)的不要;结果中 p1 < p2,按面积降序、再按 p1、p2 升序。
表结构
- Points:id(主键)、x_value、y_value
思路
两两配对用自连接,a.id < b.id 保证每对只出现一次且满足 p1 < p2。面积是横纵坐标差的绝对值相乘,x 或 y 相同时面积为 0,要排除。
参考解法
select a.id P1,b.id P2,abs(a.x_value-b.x_value)*abs(a.y_value-b.y_value) as area
from Points a,Points b
where a.id<b.id and a.x_value != b.x_value and a.y_value != b.y_value
order by area desc,P1 ,P2
易错点
- 用
a.id != b.id每对会出现两次。 - 面积为 0 的点对也要排除,题目只要真正能构成矩形的。