开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第29天,点击查看活动详情
一、题目描述:
1037. 有效的回旋镖 - 力扣(LeetCode) (leetcode-cn.com)
给定一个数组 points ,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一个点,如果这些点构成一个 回旋镖 则返回 true 。
回旋镖 定义为一组三个点,这些点 各不相同 且 不在一条直线上 。
示例 1:
输入:points = [[1,1],[2,3],[3,2]]
输出:true
示例 2:
输入:points = [[1,1],[2,2],[3,3]]
输出:false
提示:
- points.length == 3
- points[i].length == 2
- 0 <= xi, yi <= 100
二、思路分析:
两点式直线方程:设线上有两个点[x1,y1] [x2,y2];
则方程为:(y-y2)/(y1-y2)=(x-x2)/(x1-x2)
间输入的第一和第二点作为[x1,y1] [x2,y2],第三个点作为[x,y] 带入方程,如方程成立则在一条直线上,否则三个点不在一条直线上
本方法问题: 需要排除(y1-y2)=0 和(x1-x2)=0的情况,故此需要把三个点互换使(y1-y2)=0 和(x1-x2)=0不成立。 需特殊处理水平线,和垂直线,以及三点重合的情况;
三、AC 代码:
public static boolean isBoomerang(int[][] points) {
if (points.length != 3)
return false;
float[] y = new float[3];
float[] x = new float[3];
for (int i = 0; i < points.length; i++) {
if (points[i].length != 2) {
return false;
}
x[i] = Float.valueOf(points[i][0]);
y[i] = Float.valueOf(points[i][1]);
}
// 直线方程 (y-y2)/(y1-y2)=(x-x2)/(x1-x2)
// 避免除0
if ((y[0] - y[1]) != 0 && (x[0] - x[1]) != 0)
return (y[2] - y[1]) / (y[0] - y[1]) != (x[2] - x[1]) / (x[0] - x[1]);
else if ((y[2] - y[1]) != 0 && (x[2] - x[1]) != 0) {
return (y[0] - y[1]) / (y[2] - y[1]) != (x[0] - x[1]) / (x[2] - x[1]);
} else if ((y[2] - y[0]) != 0 && (x[2] - x[0]) != 0) {
return (y[1] - y[0]) / (y[2] - y[0]) != (x[1] - x[0]) / (x[2] - x[0]);
} else {
// 处理水平线,和垂直线,以及三点重合
return !((y[1] == y[0] && y[0] == y[2]) || (x[1] == x[0] && x[0] == x[2]));
}
}
范文参考: