【LintCode】Max Points on a Line(笔记)

Description

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

(二维平面上有n个点,求出共线的最多点数)

Example

Given 4 points: (1,2)(3,6)(0,0)(1,3).

The maximum number is 3.

Notes

 

本想的方法是用斜率来计算,每两个点间计算斜率,因为有些细节没注意到总不能通过。

只给出了1个点或2个点的情况;

有的点重复给出的情况(对其就不要计算斜率了,把重复次数记录下来);

斜率不能计算的情况(在一条竖线上,slope可以用 INT_MAX 来表示);

在一条横线上的情况(其实和一般斜率的情况一样计算,结果为0而已);

 

Solution

固定一个点,计算一轮其他点和该点的斜率(用map计数,斜率相同的点就在同一直线上),找到该点固定下的最多点数max。

计算斜率时,要注意【重复的点】和【斜率为无穷大即x值相同的点】。

 

/**
 * Definition for a point.
 * struct Point {
 *     int x;
 *     int y;
 *     Point() : x(0), y(0) {}
 *     Point(int a, int b) : x(a), y(b) {}
 * };
 */
class Solution {
public:
    /**
     * @param points an array of point
     * @return an integer
     */
    int maxPoints(vector<Point>& points) {
        // Write your code here
        if(points.size()<3)
            return points.size();
        int max = 0;
        map<double, int> slopeMapNum;
        for(int fix=0; fix<points.size(); fix++){  //依次作为固定点
            Point fixP = points[fix];
            slopeMapNum.erase(slopeMapNum.begin(), slopeMapNum.end());
            int cover = 1;
            for(int i=0; i<points.size(); i++){
                double slope;
                if(i==fix)                          //同一个点,跳过
                    continue;
                if(fixP.x==points[i].x && fixP.y==points[i].y){  //与固定点重复的点
                    cover++;
                    continue;
                }
                else if(fixP.x==points[i].x){      //与固定点在同一条竖线上
                    slope = INT_MAX;
                }
                else{
                    slope = 1.0*(fixP.y-points[i].y)/(fixP.x-points[i].x);
                }
                map<double, int>::iterator it;
                it = slopeMapNum.find(slope);
                if(it==slopeMapNum.end())
                    slopeMapNum.insert(pair<double,int>(slope,1));
                else
                    slopeMapNum[slope] += 1;
            }
            if(slopeMapNum.empty())
                max = cover>max ? cover:max;
            else{
                map<double, int>::iterator j;
                for(j=slopeMapNum.begin(); j!=slopeMapNum.end(); j++)
                    max = (j->second+cover)>max ? (j->second+cover):max;
            }
        }
        return max;
    }
};

 

C++ Notes

// map插入元素
myMap["a"] = 1; 
myMap.insert(map<string, int>::value_type("b",2)); 
myMap.insert(pair<string, int>("c",3)); 
myMap.insert(make_pair<string, int>("d",4));

// 删除map某键的元素
cmap.erase("bfff"); 
map<string,int>::iterator it = cmap.find("mykey");
if(it!=cmap.end())
    cmap.erase(it);

// 删除所有元素
cmap.erase(cmap.begin(),cmap.end());  

// 迭代map
map<string, int>::iterator it;
for(it=myMap.begin(); it!=myMap.end(); ++it){}

// 其他成员方法
myMap.empty()
myMap.size()
myMap.clear()  //清空

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值