博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[CareerCup] 7.6 The Line Passes the Most Number of Points 经过最多点的直线
阅读量:4691 次
发布时间:2019-06-09

本文共 2828 字,大约阅读时间需要 9 分钟。

 

7.6 Given a two-dimensional graph with points on it, find a line which passes the most number of points.

 

这道题给了我们许多点,让我们求经过最多点的一条直线。给之前那道一样,都需要自己写出点类和直线类。在直线类中,我用我们用斜率和截距来表示直线,为了应对斜率不存在情况,我们还需用一个flag来标记是否为垂直的线。在直线类中,我们要有判断两条直线是否相等的函数。判断相等的方法和之前那道相同,都需要使用epsilon,只要两个数的差值的绝对值小于epsilon,我们就认定是相等的。对于给定的所有点,每两个点能组成一条直线,我们的方法是遍历所有的直线,把所有相同的直线都存入哈希表中,key是直线的斜率,映射关系是斜率和直线集合的映射,那么我们只需找到包含直线最多的那个集合即可,参见代码如下:

 

class Point {public:    double _x, _y;    Point(double x, double y): _x(x), _y(y) {};};class Line {public:    static constexpr double _epsilon = 0.0001;    double _slope, _intercept;    bool _infi_slope = false;    Line(Point p, Point q) {        if (fabs(p._x - q._x) > _epsilon) {            _slope = (p._y - q._y) / (p._x - q._x);            _intercept = p._y - _slope * p._x;        } else {            _infi_slope = true;            _intercept = p._x;        }    }    static double floorToNearestEpsilon(double d) {        int r = (int)(d / _epsilon);        return ((double)r) * _epsilon;    }    bool isEquivalent(double a, double b) {        return (fabs(a - b) < _epsilon);    }    bool isEquivalent(Line other) {        if (isEquivalent(_slope, other._slope) && isEquivalent(_intercept, other._intercept) && (_infi_slope == other._infi_slope)) {            return true;        }        return false;    }};class Solution {public:    Line findBestLine(vector
&points) { Line res(points[0], points[1]); int bestCnt = 0; unordered_map
> m; for (int i = 0; i < (int)points.size(); ++i) { for (int j = i + 1; j < (int)points.size(); ++j) { Line line(points[i], points[j]); insertLine(m, line); int cnt = countEquivalentLines(m, line); if (cnt > bestCnt) { res = line; bestCnt = cnt; } } } return res; } void insertLine(unordered_map
> &m, Line &line) { vector
lines; double key = Line::floorToNearestEpsilon(line._slope); if (m.find(key) != m.end()) { lines = m[key]; } else { m[key] = lines; } lines.push_back(line); } int countEquivalentLines(unordered_map
> &m, Line &line) { double key = Line::floorToNearestEpsilon(line._slope); double eps = Line::_epsilon; return countEquivalentLines(m[key], line) + countEquivalentLines(m[key - eps], line) + countEquivalentLines(m[key + eps], line); } int countEquivalentLines(vector
&lines, Line &line) { if (lines.empty()) return 0; int res = 0; for (auto &a : lines) { if (a.isEquivalent(line)) ++res; } return res; }};

 

转载于:https://www.cnblogs.com/grandyang/p/4779741.html

你可能感兴趣的文章
SYS_CONTEXT 详细用法
查看>>
Pycharm配置autopep8让Python代码更符合pep8规范
查看>>
函数的复写
查看>>
17_重入锁ReentrantLock
查看>>
winform窗口关闭提示
查看>>
64款工具,总有合适您的那款
查看>>
我的第一篇博客
查看>>
大数据学习线路整理
查看>>
【C++算法与数据结构学习笔记------单链表实现多项式】
查看>>
关于ProjectServer定制化项目中心页面
查看>>
使用Collectd + InfluxDB + Grafana进行JMX监控
查看>>
Linux下tar,zip命令详解
查看>>
C#垃圾回收机制
查看>>
31、任务三十一——表单联动
查看>>
python之hasattr、getattr和setattr函数
查看>>
maven使用阿里镜像配置文件
查看>>
Copy code from eclipse to word, save syntax.
查看>>
arguments.callee的作用及替换方案
查看>>
23 Java学习之RandomAccessFile
查看>>
P2709 小B的询问
查看>>