max-points-on-a-line
来源:互联网 发布:嵌入式系统 单片机 编辑:程序博客网 时间:2024/06/02 06:52
需要两重循环,外循环遍历起始点a,内循环遍历剩余点b。
a和b如果不重合,就可以确定一条直线。对于每个点a,构建 斜率->点数 的map
(Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)
的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。)
(1)b与a重合,以a起始的所有直线点数+1 (用dup统一相加)
(2)b与a不重合,a与b确定的直线点数+1
C++代码实现:
/**
* Definition for a point.
* struct Point {
* int x;
* int y;
* Point() : x(0), y(0) {}
* Point(int a, int b) : x(a), y(b) {}
* };
*/
class Solution {
public:
int maxPoints(vector<Point> &points) {
int size = points.size();
if (size==0 || size==1){
return size;
}
int ret = 0;//记录每一次外循环扫描结束后的同线最多点
for (int i=0;i<size;i++){
int curmax = 1;
map<double,int> mp;//构造 斜率,点数的map
int vcount = 1;//垂直点
int dup = 0;//重复点
for (int j=i+1;j<size;j++){
double x1 = points[i].x - points[j].x;
double y1 = points[i].y - points[j].y;
if (x1==0 && y1 ==0){//重复
dup++;
}else if (x1 == 0){//垂直
vcount++;
curmax = vcount>curmax?vcount:curmax;
}else{//有斜率的情况
double k = y1/x1;
if (mp[k]==0){
mp[k]=2;
}else{
mp[k]++;
}
curmax = mp[k]>curmax?mp[k]:curmax;
}
}
ret = max(curmax+dup,ret);
}
return ret;
}
};
0 0
- Max Points on a Line
- Max Points on a Line
- Max Points on a Line
- Max Points on a Line
- Max Points on a Line
- Max Points on a Line
- Max Points On a Line
- Max Points on a Line
- Max Points on a Line
- Max Points on a Line
- max points on a line
- Max Points on a Line
- Max Points on a Line
- Max Points on a Line
- Max Points on a Line
- Max Points on a Line
- Max Points on a Line
- Max Points on a Line
- C++递归遍历文件夹(一)
- 五子棋算法
- new和malloc的区别
- Android Studio 自动生成 Gson bean(json解析快捷方法)
- java集合类
- max-points-on-a-line
- IT-mongodb-mongodb常用命令
- 使用IDEA导出可运行的jar包,不引用第三方jar.
- 【Phalcon实现高性能网站】使用Phalcon高性能PHP框架搭建网站 视图之共享模板
- 前端知识总结
- 对文件的输入输出----恶补之八
- 常见排序的实现 c++ 冒泡排序 插入排序 选择排序 快速排序
- 操作系统(Linux)---fork()函数解析与进程
- Codeforces Round #361 (Div. 2)题解