【分析】这道题其实很简单,只要算三个点组成的任意两条线是否平行(斜率相等)即可,假设三个点分别是:
(a, b) (x, y) (c, d)
那么斜率相等表达成:(a - x)/ (b - y) = (c - x)/ (d - y)。 但是除法要判断除数为0的情况
因此改成乘法的形式: (a - x) * (d - y) = (c - x) * (b - y)
class Solution {
public boolean isBoomerang(int[][] ps) {
int n = ps.length - 2, i;
int a, b, c, d, x, y;
for(i = 0; i < n; i++){
a = ps[i][0];
b = ps[i][1];
x = ps[i + 1][0];
y = ps[i + 1][1];
c = ps[i + 2][0];
d = ps[i + 2][1];
if((a - x) * (d - y) != (c - x) * (b - y)) return true;
}
return false;
}
}
【向量叉乘】还是以 (a, b) (x, y) (c, d) 三个点为例,可以组成的向量为:
v1 = (x - a, y - b) v2 = (x - c, y - d)
向量叉乘的公式为:a = (x1, y1) , b = (x2, y2), a × b = ( x1y2 - x2y1 )
向量叉乘的几何意义为向量a和b构成的平行四边形的面积:
另外如果叉乘的结果为0,那么说明两条线平行。
class Solution {
public boolean isBoomerang(int[][] ps) {
int n = ps.length - 2, i;
for(i = 0; i < n; i++){
int[] v1 = new int[] {ps[i][0] - ps[i + 1][0], ps[i][1] - ps[i + 1][1]};
int[] v2 = new int[] {ps[i + 2][0] - ps[i + 1][0], ps[i + 2][1] - ps[i + 1][1]};
if(v1[0] * v2[1] - v1[1] * v2[0] != 0) return true;
}
return false;
}
}