leetcode之Max Points on a Line

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值