1,题目意思:在二维平面中,求在一条直线上的点的最大数目
2,做题思路:
两层嵌套循环实现,斜率相同的点即为在一条直线上的点,求得最大点数。
需要注意的是:
1)只有一个点时,直接返回1 ; 没有点时,要返回0,因此需要初始化max_num = 0。
2)最里面的循环分三种情况,第一,两个点相同时。第二,垂直于x轴时,斜率不存在。第三,其他,即普通情况。
第一,两个点相同时,1,因为是从头开始的循环遍历,所以首先要排除同一个点的情况。2,然后,对于重复的点,需要统计重复的点的个数。
第二,垂直于x轴时,因为不存在斜率,所以人为定义一个和正常斜率不相同的斜率。
第三,普通情况。先求出斜率。还需要判断该点是否是重复点,如果是重复点,需要额外加上重复点的个数;否则,只需正常加上斜率相同的点个数即可。同时,如果对重复的点加重复个数的时候,一定要注意避免多次加这个个数,应该定义一个变量表示该顶点是否加过重复个数。
第四,存储斜率和这个斜率的点的个数,要用map数据结构。
第五,外层循环结束一轮后,求一次max_num。最后求出最终的max_num。
3,map的使用方法。
map是一种关联容器。(set也是一种关联容器,set是通过map实现的)。map的底层实现是一棵平衡树。
map的定义:map<k,v> m;
map<k,v> m(m2);
map<k,v> m(iter1,iter2); //m用迭代器iter1和iter2之间的元素初始化。iter1和iter2之间的元素必须是pair<k,v>或者能转换为pair<k,v>。
注:键类型的约束,必须支持 “<” 运算。
map支持迭代器,但是对迭代器解引用得到的是piar<k,v>类型,需要通过pair的first和second成员才能得到map对象的键值和元素值。
map添加元素:insert()操作实现;或者,通过下标索引实现。
map删除元素:erase()操作.
map下标操作,如果没有该键值,则插入pair;否则,返回该键值对应的元素值。
代码如下:
class Solution{
public:
int maxPoints(vector<Point> &point){
vector<Point>::size_type num_points = point.size();
map<double ,int> slope_num;
//map<int ,int> repeate_node;
unsigned i = 0,j = 0;
double slope = 0;
int max_num = 0;
if(num_points == 1){
return 1;
}
//int k = 0;
for(i=0;i<num_points;i++){
Point& first_point = point[i];
map<int , int> repeate_node;
int k = 0;
int m = 0;
for(j=0;j<num_points;j++){
Point& second_point = point[j];
if((first_point.x == second_point.x) && (first_point.y == second_point.y)){
if(k){
slope = -12321;
if(slope_num[slope] == 0){
slope_num[slope] = 1;
repeate_node[first_point.x] = 1;
}
++slope_num[slope];
++repeate_node[first_point.x];
}
else if(k == 0){
k++;
continue;
}
}
else if(first_point.x == second_point.x){
slope = -32123;
if(slope_num[slope] == 0){
slope_num[slope] = 1;
}
++slope_num[slope];
}
else{
slope = (double)(second_point.y - first_point.y)/(double)(second_point.x - first_point.x);
if((m == 0) && (repeate_node[first_point.x])){
if(slope_num[slope] == 0){
slope_num[slope] = 1;
}
slope_num[slope] += repeate_node[first_point.x];
m = 1;
continue;
}
if(slope_num[slope] == 0){
slope_num[slope] = 1;
}
++slope_num[slope];
}
}
map<double ,int>::iterator first = slope_num.begin();
map<double ,int>::iterator current = first;
map<double ,int>::iterator last = slope_num.end();
while(current != last){
// cout << "j:" << j << " second:" <<current->second <<endl;
if(current->second > max_num){
max_num = current->second;
}
++current;
}
slope_num.erase(first,last);
}
return max_num;
}
};