在同一直线上最多点的数量 c语言,[LeetCode] 149. Max Points on a Line 共线点个数

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

给一个由n个点组成的2D平面,找出最多的同在一条直线上的点的个数。

共线点的条件是斜率一样,corn case:点相同;x坐标相同。

Java:

public class Solution {

public int maxPoints(Point[] points) {

int res = 0;

for (int i = 0; i < points.length; ++i) {

Map, Integer> m = new HashMap<>();

int duplicate = 1;

for (int j = i + 1; j < points.length; ++j) {

if (points[i].x == points[j].x && points[i].y == points[j].y) {

++duplicate; continue;

}

int dx = points[j].x - points[i].x;

int dy = points[j].y - points[i].y;

int d = gcd(dx, dy);

Map t = new HashMap<>();

t.put(dx / d, dy / d);

m.put(t, m.getOrDefault(t, 0) + 1);

}

res = Math.max(res, duplicate);

for (Map.Entry, Integer> e : m.entrySet()) {

res = Math.max(res, e.getValue() + duplicate);

}

}

return res;

}

public int gcd(int a, int b) {

return (b == 0) ? a : gcd(b, a % b);

}

}

Python:

class Point:

def __init__(self, a=0, b=0):

self.x = a

self.y = b

class Solution(object):

def maxPoints(self, points):

"""

:type points: List[Point]

:rtype: int

"""

max_points = 0

for i, start in enumerate(points):

slope_count, same = collections.defaultdict(int), 1

for j in xrange(i + 1, len(points)):

end = points[j]

if start.x == end.x and start.y == end.y:

same += 1

else:

slope = float("inf")

if start.x - end.x != 0:

slope = (start.y - end.y) * 1.0 / (start.x - end.x)

slope_count[slope] += 1

current_max = same

for slope in slope_count:

current_max = max(current_max, slope_count[slope] + same)

max_points = max(max_points, current_max)

return max_points

C++:

class Solution {

public:

int maxPoints(vector& points) {

int res = 0;

for (int i = 0; i < points.size(); ++i) {

map, int> m;

int duplicate = 1;

for (int j = i + 1; j < points.size(); ++j) {

if (points[i].x == points[j].x && points[i].y == points[j].y) {

++duplicate; 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}];

}

res = max(res, duplicate);

for (auto it = m.begin(); it != m.end(); ++it) {

res = max(res, it->second + duplicate);

}

}

return res;

}

int gcd(int a, int b) {

return (b == 0) ? a : gcd(b, a % b);

}

};

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值