算法笔记 -- 1037. 有效的回旋镖

199 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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]));
		}
	}

范文参考

1 行代码。。。。双百题解。 - 有效的回旋镖 - 力扣(LeetCode) (leetcode-cn.com)