zoukankan      html  css  js  c++  java
  • [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<Map<Integer, Integer>, 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<Integer, Integer> 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<Map<Integer, Integer>, 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<Point>& points) {
            int res = 0;
            for (int i = 0; i < points.size(); ++i) {
                map<pair<int, int>, 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);
        }
    };
    

        

    All LeetCode Questions List 题目汇总

  • 相关阅读:
    非线性滤波:中值滤波;双边滤波
    线性滤波:方框滤波、均值滤波、高斯滤波
    输入输出XML和YAML文件
    图像对比度、亮度值调整
    opencv图像混合,分离颜色通道、多通道图像混合
    访问图像的三种方法
    Opencv
    INSERT增加数据记录
    MySQL 语言大全
    text
  • 原文地址:https://www.cnblogs.com/lightwindy/p/8577880.html
Copyright © 2011-2022 走看看