LeetCode1232. 缀点成线

题目链接:

1232. 缀点成线 - 力扣(LeetCode)

分析:这是一个基本的数学问题,将简单的数学知识---直线的表达式和编程结合了起来。

算法思路:为了验证所给的点是否能构成一条直线,最直观的方法是,先用两个点确定一条直线,再去判断其余的点是否在这条直线上。

直线存在多种表示方法,一般式、点斜式、两点式。采用哪一种更好呢?这要根据题目做一个综合的考虑,在所有的直线中,可能会出现斜率不存在的(也就是平行于y轴),这是如果直线表达式中出现了除法就难以计算,还需要重新分其它的情况。因此建议选择两点式

(x-x1)(y-y2)=(x-x2)(y-y1)

可以观察到,两点式的左右两侧都是乘法,不会出现除0这种特殊现象。因此选择两点式。

我们开始考虑该题目的特殊情况,如果仅有两个点,那么一定可以组成直线;如果有三个及以上,那么我们进行判断,选择前两个点作为两点式里面的固定参数,将剩余的点以x,y的形式分别带入,如果不满足等式,说明这个点不在固定两点所在的直线上,返回false;如果遍历结束,那说明全部满足条件,则返回true。

参考代码:

class Solution {
public:
    bool checkStraightLine(vector<vector<int>>& coordinates) {
        if(coordinates.size()==2)//两点一定构成一条直线
            return true;
        for(int i=2;i<coordinates.size();++i){
            int a=(coordinates[i][0]-coordinates[0][0])*(coordinates[i][1]-coordinates[1][1]);//两点式的一侧
            int b=(coordinates[i][0]-coordinates[1][0])*(coordinates[i][1]-coordinates[0][1]);//两点式的另一侧
            if(a!=b)//不相等则不满足条件
                return false;
        }
        return true;
    }
};

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值