zoukankan      html  css  js  c++  java
  • [LintCode] 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.

     
    Example

    Given 4 points: (1,2), (3,6), (0,0), (1,3).

    The maximum number is 3.

    LeetCode上的原题,请参见我之前的博客Max Points on a Line

    解法一:

    class Solution {
    public:
        /**
         * @param points an array of point
         * @return an integer
         */
        int maxPoints(vector<Point>& points) {
            int res = 0, n = points.size();
            for (int i = 0; i < n; ++i) {
                int duplicate = 1;
                unordered_map<double, int> m;
                for (int j = i + 1; j < n; ++j) {
                    if (points[i].x == points[j].x && points[i].y == points[j].y) {
                        ++duplicate;
                    } else if (points[i].x == points[j].x) {
                        ++m[INT_MAX];
                    } else {
                        double slope = (double)(points[j].y - points[i].y) / (points[j].x - points[i].x);
                        ++m[slope];
                    }
                }
                res = max(res, duplicate);
                for (auto it : m) {
                    res = max(res, it.second + duplicate);
                }
            }
            return res;
        }
    };

    解法二:

    class Solution {
    public:
        /**
         * @param points an array of point
         * @return an integer
         */
        int maxPoints(vector<Point>& points) {
            int res = 0, n = points.size();
            for (int i = 0; i < n; ++i) {
                int duplicate = 1;
                map<pair<int, int>, int> m;
                for (int j = i + 1; j < n; ++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) {
                    res = max(res, it.second + duplicate);
                }
            }
            return res;
        }
        int gcd(int a, int b) {
            return (b == 0) ? a : gcd(b, a % b);
        }
    };

    解法三:

    class Solution {
    public:
        /**
         * @param points an array of point
         * @return an integer
         */
        int maxPoints(vector<Point>& points) {
            int res = 1;
            for (int i = 0; i < points.size(); ++i) {
                int repeat = 1;
                for (int j = i + 1; j < points.size(); ++j) {
                    int cnt = 0;
                    int x1 = points[i].x, y1 = points[i].y;
                    int x2 = points[j].x, y2 = points[j].y;
                    if (x1 == x2 && y1 == y2) {++repeat; continue;}
                    for (int k = 0; k < points.size(); ++k) {
                        int x3 = points[k].x, y3 = points[k].y;
                        if (x1 * y2 + x2 * y3 + x3 * y1 - x3 * y2 - x2 * y1 - x1 * y3 == 0) {
                            ++cnt;
                        }
                    }
                    res = max(res, cnt);
                }
                res = max(res, repeat);
            }
            return points.empty() ? 0 : res;
        }
    };
  • 相关阅读:
    leetcode 111二叉树的最小深度
    leetcode 104. 二叉树的最大深度
    React简介,开发环境搭建,项目结构目录
    词典中最长的单词
    React export和export default的区别
    哈希表-两个数组的交集
    BFS-地图分析&岛屿数量
    js 下拉框实现去重 & layui可输入可搜索的下拉框
    BFS(找最短距离,最短路径)二叉树最小深度&打开转盘锁&对称二叉树
    python操作es增删改查
  • 原文地址:https://www.cnblogs.com/grandyang/p/6269254.html
Copyright © 2011-2022 走看看