持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情
前言
今天的题目为简单,题目为简单的数学题,如果比较了解数学一些向量的机制的话,那么这道题应该会变得非常简单。
每日一题
今天的题目是 1037. 有效的回旋镖,难度为简单
-
给定一个数组 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
题解
暴力解法
题目给定了三个点,并且三个点的坐标都是给出了的,那么最简单的方法就是一个个去判断,先是判断三个点是否在同一个点上面,再者就是判断三个点是否在同一条直线上。
判断三个点是否在一条直线上,我们能够使用斜率来判断,也就是假设有 (a,b),(c,d),(e,f) 三个点,那么就可以求出三个斜率,并且对斜率还要做出绝对值处理。
const k1 = Math.abs(c - a) / (d - b);
const k2 = Math.abs((e - a) / (f - b);
const k3 = Math.abs((e - c) / (f - d);
判断三个斜率是否相等就能够知道三个点是否在一条直线上。
function isBoomerang(points: number[][]): boolean {
if(isTheSame(points[1],points[0]) || isTheSame(points[2],points[0]) || isTheSame(points[1],points[2])){
return false
}
const k1 = Math.abs((points[1][0] - points[0][0]) / (points[1][1] - points[0][1]));
const k2 = Math.abs((points[2][0] - points[0][0]) / (points[2][1] - points[0][1]));
const k3 = Math.abs((points[2][0] - points[1][0]) / (points[2][1] - points[1][1]));
console.log(k1,k2,k3)
if(k1 == k2 && k2 == k3){
return false
}
return true
};
function isTheSame(coordinate1:number[],coordinate2:number[]):boolean{
if(coordinate1[0]==coordinate2[0] && coordinate1[1]==coordinate2[1]){
return true
}
return false
}
数学解法
有接触过数学的向量可能就会清楚,对于一个平面上的两条线,只要他们的向量叉乘为0,那么就说明这两条线平行,并且因为题目中是三个点,组成两条线的话一定会有一个公用的点,所有一旦平行,那么就说明三个点再一条直线上面,我们就能够以此来判断,三个点的位置。
var isBoomerang = function(points: number[]):boolean {
const coordinate1 = [points[1][0] - points[0][0], points[1][1] - points[0][1]];
const coordinate2 = [points[2][0] - points[0][0], points[2][1] - points[0][1]];
return coordinate1[0] * coordinate2[1] - coordinate1[1] * coordinate2[0] != 0;
};