[CareerCup] 7.6 The Line Passes the Most Number of Points 经过最多点的直线
7.6 Given a two-dimensional graph with points on it, find a line which passes the most number of points.
这道题给了我们许多点,让我们求经过最多点的一条直线。给之前那道7.5 A Line Cut Two Squares in Half 平均分割两个正方形的直线一样,都需要自己写出点类和直线类。在直线类中,我用我们用斜率和截距来表示直线,为了应对斜率不存在情况,我们还需用一个flag来标记是否为垂直的线。在直线类中,我们要有判断两条直线是否相等的函数。判断相等的方法和之前那道7.3 Line Intersection 直线相交相同,都需要使用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<Point> &points) {
Line res(points[], points[]);
int bestCnt = ;
unordered_map<double, vector<Line> > m;
for (int i = ; i < (int)points.size(); ++i) {
for (int j = i + ; 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<double, vector<Line> > &m, Line &line) {
vector<Line> 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<double, vector<Line> > &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<Line> &lines, Line &line) {
if (lines.empty()) return ;
int res = ;
for (auto &a : lines) {
if (a.isEquivalent(line)) ++res;
}
return res;
}
};
[CareerCup] 7.6 The Line Passes the Most Number of Points 经过最多点的直线的更多相关文章
- [CC150] Find a line passing the most number of points
Problem: Given a two-dimensional graph with points on it, find a line which passes the most number o ...
- [CareerCup] 7.5 A Line Cut Two Squares in Half 平均分割两个正方形的直线
7.5 Given two squares on a two-dimensional plane, find a line that would cut these two squares in ha ...
- [LeetCode OJ] 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.
//定义二维平面上的点struct Point { int x; int y; Point(, ):x(a),y(b){} }; bool operator==(const Point& le ...
- leetcode ex3 找出穿过最多点的直线 Max Points on a Line
题目 https://oj.leetcode.com/problems/max-points-on-a-line/ 答案与分析 http://www.aiweibang.com/yuedu/18326 ...
- CareerCup All in One 题目汇总 (未完待续...)
Chapter 1. Arrays and Strings 1.1 Unique Characters of a String 1.2 Reverse String 1.3 Permutation S ...
- CareerCup All in One 题目汇总
Chapter 1. Arrays and Strings 1.1 Unique Characters of a String 1.2 Reverse String 1.3 Permutation S ...
- Careercup | Chapter 7
7.4 Write methods to implement the multiply, subtract, and divide operations for integers. Use only ...
- 2018浙江省赛(ACM) The 15th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple
我是铁牌选手 这次比赛非常得爆炸,可以说体验极差,是这辈子自己最脑残的事情之一. 天时,地利,人和一样没有,而且自己早早地就想好了甩锅的套路. 按理说不开K就不会这么惨了啊,而且自己也是毒,不知道段错 ...
- iOS: 如何正确的绘制1像素的线
iOS 绘制1像素的线 一.Point Vs Pixel iOS中当我们使用Quartz,UIKit,CoreAnimation等框架时,所有的坐标系统采用Point来衡量.系统在实际渲染到设置时会帮 ...
随机推荐
- 【转载】小米2进入recovery的方法
用过M1的朋友都多多少少的了解到~进入recovery是关机下同时 按 音量(+)+电源键. 其实M2也一样,但是我觉得是有点区别的. 在M1的时候,只要同时长按这两个键就可以的了. 但是M2呢?我发 ...
- leangoo更换背景、设置颜色标签功能上线啦!
leangoo看板背景太单调?卡片标签想要添加多个?没有问题,Leangoo的本次更新就给大家带来了漂亮背景和实用的颜色标签设置,接下来就让我们一起来看看吧! 设置背景: 点击看板右上角个人头像图标按 ...
- IE下实现打印功能
先贴代码: <html> <head> <style type="text/css"> *{margin:0px;padding:0px;} . ...
- AngularJS的一点学习笔记
ng-options="item.action for item in todos" ng-options表达式的基本形式, 形如 "<标签> for < ...
- jsp页面img利用tomcat配置访问服务器绝对路径显示图片
1.打开tomcat下的server.xml文件,路径\apache-tomcat-7.0.62\conf文件夹下. 2.下<host></host>加入<Context ...
- Web Storage API : LocalStroage
这是一篇详细介绍详细介绍详细介绍_(:з」∠)_ 背景: 当你访问一个页面,并不是丢到服务器,等待用户访问就可以了的.从输入网址到显示网页的全过程,可以参考这里 简单来说,在输入url按下回车键后,首 ...
- SQL 分页查询的四种方法
方法一 假设现在有这样的一张表: CREATE TABLE test ( id int primary key not null identity, names ) ) 然后向里面插入大约100条数据 ...
- mac 免密码登陆服务器
由于mac os 是基于unix的操作系统终端和linux非常类似,所以不用借助类似于windows下的putty 和CRT工具即可远程登陆linux服务器,只需简单地3步即可免密码ssh远程. 1 ...
- Web性能优化之动态合并JS/CSS文件并缓存客户端
来源:微信公众号CodeL 在Web开发过程中,会产生很多的js/css文件,传统的引用外部文件的方式会产生多次的http请求,从而加重服务器负担且网页加载缓慢,如何在一次请求中将多个文件一次加载出来 ...
- 数据结构--栈 codevs 1107 等价表达式
codevs 1107 等价表达式 2005年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Descripti ...