本文最后更新于:2023年3月19日 晚上
1037.有效的回旋镖
Category |
Difficulty |
Likes |
Dislikes |
algorithms |
Easy (43.81%) |
68 |
- |
Tags
Companies
给定一个数组 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
Discussion | Solution
思路
按题意先判断是否是重复的点,再和判断和其他线的连线是否是已经出现过的直线。直线和点都用 set 统计。
解答
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
var isBoomerang = function (points) { const set = new Set(), setE = new Set();
const calculateK = ([x1, y1], [x2, y2]) => (y2 - y1) / (x2 - x1);
for (const point of points) { const [x, y] = point; const str = `${x},${y}`; if (set.has(str)) return false; for (const item of set) { const [x2, y2] = item.split(","); const k = calculateK([x, y], [x2, y2]); let equation; if (k === Infinity) { equation = `x = ${x}`; } else { const b = y2 - k * x2; equation = `y = ${k}x + ${b}`; } if (setE.has(equation)) return false; setE.add(equation); } set.add(str); }
return true; };
|