Leetcode 149 直线上最多的点数 C++

思路:利用哈希表记录两点的差分(dx,dy)的个数,在记录dx和dy的时候,将dx和dy同时除以他们两个的最大公约数,这样斜率相同的点的dx和dy就相同。利用p在记录相同点的个数,最后的结果就是相同点的个数加上斜率相同点的个数。
注意:这里用了两次循环,其实每次统计的是包含最外层那个点在内的(即点points[i]),直线上最多的点数。统计的相同的点也是统计和points[i]重合的点,当外循环中的i变化时,p的值重新初始化为1,重新开始统计。

/**
 * 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) {
      int ans = 0;
		for (int i = 0; i < points.size(); ++i)
		{
			map<pair<int, int>, int> m;
			int p = 1;
			for (int j = i + 1; j < points.size(); ++j)
			{
				if (points[i].x == points[j].x && (points[i].y == points[j].y)) { ++p; continue; }
				int dx = points[j].x - points[i].x;
				int dy = points[j].y - points[i].y;
				int d = gcd(dx, dy);
				++m[{dx / d, dy / d}];
			}
			ans = max(ans, p);
			for (auto it = m.begin(); it != m.end(); ++it)
			{
				ans = max(ans, it->second+p);
			}
		}
		return ans;
	}
	int gcd(int a, int b)
	{
		return (b == 0) ? a : gcd(b, a%b);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值