3月21日周五
也许是喝了太多咖啡,导致12点毫无睡意,于是继续在书房呆坐着,还是和往常一样打开leetcode,寻找难度分在1800以下的题,然后就遇到了Leetcode 593。一看题目,四个点能否组成正方形,心想就是4个点,即使暴力也只到256,于是开始冷静的思考,回忆起了初中的数学,终于发现了只要从4个点中任意挑选3个点,这三个点构成的三边有两条边相等,且相等的这两条边的长度的平方和等于第三条边的平方和,就一定能判定这四个点能构成正方形,噌噌噌,代码撸出来了。
593. 有效的正方形
给定2D空间中四个点的坐标 p1, p2, p3 和 p4,如果这四个点构成一个正方形,则返回 true 。
点的坐标 pi 表示为 [xi, yi] 。 输入没有任何顺序 。
一个 有效的正方形 有四条等边和四个等角(90度角)。
示例 1:
输入: p1 = [0,0], p2 = [1,1], p3 = [1,0], p4 = [0,1]
输出: true
示例 2:
输入:p1 = [0,0], p2 = [1,1], p3 = [1,0], p4 = [0,12]
输出:false
示例 3:
输入:p1 = [1,0], p2 = [-1,0], p3 = [0,1], p4 = [0,-1]
输出:true
提示:
p1.length == p2.length == p3.length == p4.length == 2
-10**4 <= xi, yi <= 10**4
Ruby解
# @param {Integer[]} p1
# @param {Integer[]} p2
# @param {Integer[]} p3
# @param {Integer[]} p4
# @return {Boolean}
def valid_square(p1, p2, p3, p4)
if [p1,p2,p3,p4].uniq.length < 4
return false
else
[p1,p2,p3,p4].combination(3).to_a.all? {|it| cal(it[0],it[1],it[2])}
end
end
def cal(x,y,z)
t1 = (x[0] - y[0])**2 + (x[1] - y[1])**2
t2 = (x[0] - z[0])**2 + (x[1] - z[1])**2
t3 = (y[0] - z[0])**2 + (y[1] - z[1])**2
t = [t1,t2,t3].sort
if t[0] == t[1] && t[0] + t[1] == t[2]
return true
else
return false
end
end