【JAVA】【刷题子】1037. 有效的回旋镖

163 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情

愿高三学子们都高考顺利,金榜题名,旗开得胜,考上理想大学!

一、题目与题目分析

题目

  给定一个数组 points ,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一个点,如果这些点构成一个 回旋镖 则返回 true 。
  回旋镖 定义为一组三个点,这些点各不相同不在一条直线上 。
提示:

题目分析

  这道题是简单题,就是给定三个点,判断这三个点都不相同,且不在同一条直线上。

二、整体逻辑与主要代码

题目分析已经比较清楚了,接下来我们进入代码设计。

整体逻辑

  (斜率计算公式:过两个已知点 (x1, y1) 和 (x2, y2) 的直线,若x1≠x2,则该直线的斜率为 k=(y1-y2)/(x1-x2))
  三个点给定的情况下,我们只需要计算俩俩的斜率,保证这两个斜率不相等即是该题答案。
  所以,我们在两点斜率计算公式的前提下,计算两个斜率k01k02不相等即可。(即 k01 != k02
  假设三点为:(x0,y0)(x1,y1)(x2,y2)。斜率 k01 = (y0-y1)/(x0-x1); 斜率 k02 = (y0-y2)/(x0-x2)
  最后就是 k01 != k02
  转化为 (y0-y1)/(x0-x1) != (y0-y2)/(x0-x2)
  再转化为 (y0-y1)*(x0-x2) != (y0-y2)*(x0-x1)
  要注意的一个点是:转化后的三个点不限定 x0!=x1x0!=x2了。因此,也包括了判断是否在同一条直线上。

主要代码

整体逻辑清晰了之后,同时也有较清楚的注释。直接来看代码吧! (如有不懂的或者更好的建议,欢迎评论区分享友友的看法哈~)

class Solution {

	public boolean isBoomerang(int[][] points) {
		// 已知三点位置(仅有三点):(x0,y0),(x1,y1),(x2,y2)
		// 计算点0和点1的斜率(k01=y01/x01)
		int x01 = points[0][0] - points[1][0]; // 即 x0-x1
		int y01 = points[0][1] - points[1][1]; // 即 y0-y1
		
		// 计算点0和点2的斜率(k02=y02/x02)
		int x02 = points[0][0] - points[2][0]; // 即 x0-x2
		int y02 = points[0][1] - points[2][1]; // 即 y0-y2
		
		// 因为 k01=y01/x01 ; k02=y02/x02 所以只要保证两个斜率不相等即可,即k01!=k02
		// 因此,k01!=k02,则 y01/x01 != y02/x02;即,y01*x02 != y02*x01
		return y01*x02 != y02*x01;
	}
}

三、结果展示

image.png

四、总结

继续做算法题,才发现会的数学公式,都是很有用并且能用上的;同时,通过公式的演变,神奇的计算就更加凸显了~

题目数据库

Gitee:传送门

文章小尾巴

文章写作、模板、文章小尾巴可参考:《写作“小心思”》
  感谢你看到最后,最后再说两点~
  ①如果你持有不同的看法,欢迎你在文章下方进行留言、评论。
  ②如果对你有帮助,或者你认可的话,欢迎给个小点赞,支持一下~
  我是南方者,一个热爱计算机更热爱祖国的南方人。

  (文章内容仅供学习参考,如有侵权,非常抱歉,请立即联系作者删除。)