题目要求
小M正在玩一个几何游戏,给定一个二维平面上的三个点 points,其中每个点用坐标 points[i] = [xi, yi] 表示。如果三点构成一个回旋镖,则返回 true。回旋镖的定义是三点不在一条直线上,并且这三个点互不相同。
请你帮助小M判断这些点是否构成一个回旋镖。
思路分析
根据回旋镖的定义,我想到的还是利用数学知识来解决,即根据斜率 k是否相等来判断,至于三个点互不相同就很简单了,使用Arrays.equals( )方法就可以判断了。
代码实现
import java.util.Arrays;
public class Main {
public static boolean solution(int[][] points) {
if(Arrays.equals(points[0], points[1])||Arrays.equals(points[0], points[2])||Arrays.equals(points[1], points[2])){
return false;
}
// write code here
int x1=points[0][0],y1=points[0][1];
int x2=points[1][0],y2=points[1][1];
int x3=points[2][0],y3=points[2][1];
if((y3-y2)*(x2-x1)==(y2-y1)*(x3-x2)){
return false;
}else{
return true;
}
}
public static void main(String[] args) {
System.out.println(solution(new int[][]{{1, 1}, {2, 3}, {3, 2}}) == true);
System.out.println(solution(new int[][]{{1, 1}, {2, 2}, {3, 3}}) == false);
System.out.println(solution(new int[][]{{0, 0}, {1, 1}, {1, 0}}) == true);
}
}
知识点总结
-
数组比较:使用
Arrays.equals检查是否有两个点相同。 -
坐标几何:通过计算斜率判断点的共线性。
-
交叉乘法比较斜率:使用交叉乘法避免除法操作。
个人思考
在处理斜率时,通过交叉乘法来避免除法,这样的数学处理思路让我体会到,数学知识在编程中的应用可以直接提升代码的效率和可靠性。通过这段代码可以看到,数学并不是简单的公式代入,而是找到一种可靠且简便的方法。它提醒我,在解决类似几何问题时,可以试着运用这种替代性思路来减少误差。
学习建议
-
夯实几何基础知识
- 理解几何中的数学概念:几何问题的核心在于对数学概念的理解,比如斜率、坐标变化、点与线的关系等。可以回顾基础几何知识,特别是斜率的计算、平面几何中的向量等。
- 通过手动推导加深理解:尝试在纸上手动推导几何关系。比如手动计算三点共线的公式,通过具体数字验证代码逻辑。手动推导不仅让数学关系更直观,还能培养准确的数学直觉。
-
多练习不同几何问题
- 拓展几何问题的练习:尝试解决其他与几何相关的编程题,比如三角形面积、判断点在多边形内、凸包算法等。这些问题都有很强的几何基础,可以加深对坐标和线段处理的理解。
- 逐步提高题目难度:从简单的共线性判断,过渡到需要更多逻辑处理的几何题。分阶段地提升问题难度会帮助你积累更多的几何和算法技巧。