LeetCode:1232. 缀点成线
思路提供: 面试题 16.14. 最佳直线 ( 数学 向量共线 )
思路:
- 首先根据第一个点移动到原点,使得直线变成过原点的直线. ( 直线一般方程 Ax + By + C == 0)
- 向量共线的方式
2.1 三点共线: 两个点(x1,y1)(x2, y2)分别减去 第三个点(x0, y0), 如果 x 1 ∗ y 2 = = x 2 ∗ y 1 x1 * y2 == x2 * y1 x1∗y2==x2∗y1 就是三点共线。
AC Code 直线一般方程
class Solution {
public boolean checkStraightLine(int[][] cd) {
// 把直线变成过原点的 -> 查看后面点的 b 是不是为 0, 不是 0 的话就返回 false
int len = cd.length;
int a = cd[0][0], b = cd[0][1];
int x0 = cd[1][0] - a, y0 = cd[1][1] - b;
// 移动
for(int i = 2; i < len; i++) {
cd[i][0] -= a;
cd[i][1] -= b;
// 直线的一般方程: Ax + By + C = 0 >> 过原点 C == 0
// 然后代入 x0 and y0 --> 得 A = y0, B = -x0
if(y0 * cd[i][0] + -x0 * cd[i][1] != 0) return false;
}
return true;
}
}
AC Code 向量共线方式
class Solution {
public boolean checkStraightLine(int[][] cd) {
int len = cd.length;
int x0 = cd[1][0] - cd[0][0];
int y0 = cd[1][1] - cd[0][1];
for(int i = 2; i < len; i++) {
int x1 = cd[i][0] - cd[0][0];
int y1 = cd[i][1] - cd[0][1];
if(x0 * y1 != y0 * x1) return false;
}
return true;
}
}