leetcode之Max Points on a Line

来源:互联网 发布:网易公开课算法导论 编辑:程序博客网 时间:2024/05/22 03:25

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;}};


  

0 0