zoukankan      html  css  js  c++  java
  • Max Points on a Line

    Max Points on a Line

      Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.

    • 题目大意:给定n个二维平面上的点,求出这n个点当中最多有多少个点在同一直线上。
    • 解题思路:每次取定一个点p1,然后求出p1与其他的n-1个点的斜率,并统计斜率相同的数目,取最大值即可。
    • 具体实现:
    #include <iostream>
    #include <map>
    #include <climits>
    
    using namespace std;
    
    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 maxNum =0;
        	int size = points.size();
        	int i,j;
       		if(size <=2)   //如果点的个数小于3个,则最大数目为点的个数 
       			return size;
        	for(i=0;i<size;i++)
        	{
        		int cnt =0;
       			map<double,int> mp;
    	    	for(j=0;j<size;j++)
    	    	{
    	    		if(i==j)
    	    			continue;
        			if(points[i].x == points[j].x && points[i].y == points[j].y)
        			{
    			    	cnt++;
    			    	continue;
    			    }	
    			    //注意当直线与y轴平行的情况 
    			    double slope = points[i].x == points[j].x ? INT_MAX : (double)(points[j].y - points[i].y)/(points[j].x - points[i].x);  
                    mp[slope]++;  
    	    	}
    	    	
    	    	if(mp.size()==0)   //防止mp为空时,下面的for循环不执行 
    	    		mp[INT_MIN] =0;
    	    	map<double,int>::iterator it = mp.begin();
    	    	for(;it!=mp.end();it++)
    	    	{
    	    		if(it->second+ cnt > maxNum)
    	    			maxNum = it->second +cnt;
    	    	}
    	    }
    	    return maxNum+1;
        }
    };
    
    
    int main(int argc, char *argv[])
    {
    	vector<Point> points;
    	Point point[3];
    	int i=0;
    	for(i=0;i<3;i++)
    	{
    		point[i].x = 1;
    		point[i].y= 1;
    		points.push_back(point[i]);
    	}
    	Solution solution;
    	cout<<solution.maxPoints(points);
    	return 0;
    }
    

      这里要注意3个地方:

      1)如果点的个数小于3个,则最大数目为点的个数;

      2)考虑重复点的情况,重复点是无法计算斜率的;

      3)考虑直线与y轴平行时,斜率为无穷大的情况。

  • 相关阅读:
    Java vs C++ 基础异同比较
    2. 数组
    1. 数据结构概述
    动态规划专题:LeetCode 完全平方数
    动态规划专题:LeetCode 乘积最大子数组
    动态规划专题:LeetCode连续数列
    动态规划专题:LeetCode 按摩师
    3. 无重复字符的最长子串
    字典树(前缀树/后缀树)
    10. 排序算法思想概述及总结(精华)
  • 原文地址:https://www.cnblogs.com/dolphin0520/p/3737561.html
Copyright © 2011-2022 走看看