持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情
愿高三学子们都高考顺利,金榜题名,旗开得胜,考上理想大学!
一、题目与题目分析
题目
给定一个数组 points ,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一个点,如果这些点构成一个 回旋镖 则返回 true 。
回旋镖 定义为一组三个点,这些点各不相同且不在一条直线上 。
提示:
points.length == 3
points[i].length == 2
0 <= xi, yi <= 100
(题目来源:力扣:1037. 有效的回旋镖)
题目分析
这道题是简单题,就是给定三个点,判断这三个点都不相同,且不在同一条直线上。
二、整体逻辑与主要代码
题目分析已经比较清楚了,接下来我们进入代码设计。
整体逻辑
(斜率计算公式:过两个已知点 (x1, y1) 和 (x2, y2) 的直线,若x1≠x2,则该直线的斜率为 k=(y1-y2)/(x1-x2))
三个点给定的情况下,我们只需要计算俩俩的斜率,保证这两个斜率不相等即是该题答案。
所以,我们在两点斜率计算公式的前提下,计算两个斜率k01
,k02
不相等即可。(即 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!=x1
和 x0!=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;
}
}
三、结果展示
四、总结
继续做算法题,才发现会的数学公式,都是很有用并且能用上的;同时,通过公式的演变,神奇的计算就更加凸显了~
题目数据库
Gitee:传送门
文章小尾巴
文章写作、模板、文章小尾巴可参考:《写作“小心思”》
感谢你看到最后,最后再说两点~
①如果你持有不同的看法,欢迎你在文章下方进行留言、评论。
②如果对你有帮助,或者你认可的话,欢迎给个小点赞,支持一下~
我是南方者,一个热爱计算机更热爱祖国的南方人。
(文章内容仅供学习参考,如有侵权,非常抱歉,请立即联系作者删除。)