leetcode之Max Points on a Line
2014-03-31 22:08
211 查看
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;否则,返回该键值对应的元素值。
代码如下:
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; } };
相关文章推荐
- leetcode题目解答--Max Points on a Line
- LeetCode之Max Points on a Line
- LeetCode149:Max Points on a Line
- LeetCode--Max Points on a Line
- LeetCode Max Points on a Line
- LeetCode: Max Points on a Line
- Max Points on a Line - LeetCode
- LeetCode 149. Max Points on a Line(直线上的点)
- LeetCode Max Points on a Line
- LeetCode-Max Points on a Line[AC源码]
- max-points-on-a-line(Leetcode)
- LeetCode | 149. Max Points on a Line求多个点里面在一条直线上的点最多有多少个难题
- LeetCode__Max Points on a Line
- leetcode_149. Max Points on a Line
- Leetcode 149. Max Points on a Line
- [LeetCode] Max Points on a Line
- Leetcode 149-Max Points on a Line
- LeetCode 解题报告 Max Points on a Line
- LeetCode Max Points on a Line
- LeetCode Max Points on a Line