max-points-on-a-line

       在一个二维平面上,求最大的点个数,要求这些点在一条直线上。

1、题目描述

Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.

2、思路

       首先,两点确定一条直线;

       假设某点A在最终的解中,那么只要分别计算出点A和剩余其它n-1个点的斜率,就可以得到包含点A的所有斜率。因为这些斜率都包含点A,所以斜率相同的肯定在一条直线上。由此可以计算经过点A的所有斜率中,包含点个数最多的那一条直线。

        只要像处理点A一样,遍历剩余每个点,经过比较,就可以算出最终的解。

3、代码思路

  需要两重循环,第一重循环遍历起始点a,第二重循环遍历剩余点b。

  a和b如果不重合,就可以确定一条直线。

  对于每个点a,构建 斜率->点数 的map。

  (1)b与a重合,以a起始的所有直线点数+1 (用dup统一相加)

  (2)b与a不重合,a与b确定的直线点数+1

4、代码

/**
 * Definition for a point.
 * struct Point {
 *     int x;
 *     int y;
 *     Point() : x(0), y(0) {}
 *     Point(int a, int b) : x(a), y(b) {}
 * };
 */
class Solution {
public:
	int maxPoints(vector<Point> &points) {
		if (points.size() == 0)
			return 0;
		if (points.size() == 1)
			return 1;
		int res = 0;
		for (int i = 0; i < points.size(); ++i) {
			int curMax = 1;  
			int vCnt = 0;  //记录和i垂直线上的点
			int dupCnt = 0;  //记录和i重复的点
			map<double, int> m;
			for (int j = 0; j < points.size(); ++j) {
				if (i != j) {
					double x = points[i].x - points[j].x;
					double y = points[i].y - points[j].y;
					if (x == 0 && y == 0)
						++dupCnt;
					else if (x == 0)
						++vCnt;
					else {
						double k = y / x;
						if (m[k] == 0)
							m[k] = 2;
						else
							m[k]++;
						curMax = max(curMax, m[k]);
					}
				}
			}
			curMax = max(curMax, vCnt + 1);  //和i垂直的线上的点个数比较
			res = max(res, curMax + dupCnt);
		}
		return res;
	}
};

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值