leetcode, LC3: max-points-on-a-line

1 题目描述

对于给定的n个位于同一二维平面上的点,求最多能有多少个点位于同一直线上
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line

示例1

输入

[(0,0),(0,1)]

输出

2

示例2

输入

[(2,3),(3,3),(-5,3)]
输出

3

解题思路

暴力搜索法:
建立一个列表,列表中的每一个元素还是一个列表。内层列表代表一条直线,即内层列表的元素为各个点,而外层列表是直线的集合。
我们遍历点的所有两两组合,然后判断其余点是否在这两个点构成的直线上,是则加入该直线,否则不做另外处理。
最后我们找到点最多的那条直线并输出该直线上点的数目。

代码实现

/**
 * struct Point {
 *	int x;
 *	int y;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param points Point类vector 
     * @return int整型
     */
    int maxPoints(vector<Point>& points) {
        // write code here
        int numOfPoints = points.size();
        if(numOfPoints == 0) return 0;
        if(numOfPoints == 1) return 1;
        
        vector<vector<Point>> lines;
        for(int i = 0; i < numOfPoints - 1; i++){
            for(int j = i + 1; j < numOfPoints; j++){
                Point point1 = points[i];
                Point point2 = points[j];
                vector<Point> line;
                line.push_back(point1);
                line.push_back(point2);
                for(int k = 0; k < numOfPoints; k++){
                    if(k != i && k != j){
                        Point point3 = points[k];
                        if(pointEqualTo(point3, point1) || pointEqualTo(point3, point2)){
                            line.push_back(point3);
                            continue;
                        }
                        if(point2.x - point1.x == 0 && point3.x - point1.x == 0){
                            line.push_back(point3);
                            continue;
                        }
                        if(doubleEqualTo(calcGradient(point1, point3),
                                         calcGradient(point1, point2))
                           &&doubleEqualTo(calcGradient(point2, point3),
                                           calcGradient(point2, point1))){
                            line.push_back(point3);
                        }
                    }
                }
                lines.push_back(line);
            }
        }
        int maxNumOfPoints = -1;
        int numOfLines = lines.size();
        for(int i = 0; i < numOfLines; i++){
            int numOfPointsOfLineI = lines[i].size();
            if(numOfPointsOfLineI > maxNumOfPoints){
                maxNumOfPoints = numOfPointsOfLineI;
            }
        }
        return maxNumOfPoints;
    }
    
    double calcGradient(Point point1, Point point2){
        return (double)(point2.y - point1.y) / (double)(point2.x - point1.x);
    }
    
    bool doubleEqualTo(double doubleNum1, double doubleNum2){
        return fabs(fabs(doubleNum1) - fabs(doubleNum2)) < 1e-5;
    }
    
    bool pointEqualTo(Point point1, Point point2){
        return point1.x == point2.x && point1.y == point2.y;
    }
};

运行结果

运行时间:26ms
占用内存:1160k

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值