1957

无聊蛋疼的1957写的低端博客
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[leetcode]Max Points on a Line

Posted on 2013-12-26 10:25  1957  阅读(1660)  评论(0编辑  收藏  举报

给出平面上的点,问一条直线最多穿过几个点.

要不是之前看过这个题的题解,我感觉可能会一点想法都木有...

我可能会去,枚举两个点,然后再枚举其他点是否在这个直线上,O(n^3).

实际上呢,我们只需要枚举一个点,然后再枚举其他点和这个点构成的斜率.

既然斜率相同,而且过一个点,当然在一个直线上啦.

然后找出构成的所有的斜率里面点最多的那个就ok啦.

 

不过要注意处理的是:

1,没有点

2,相同点(题意似乎是算做n个而不是一个)

3,斜率的话要注意垂直

 

/**
 * 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:
    int maxPoints(vector<Point> &points) {
        if(points.size() == 0) return 0;
        unordered_map<double , int> count;
        int size = points.size();
        int ans = 0;
        for(int i = 0 ; i < size ; i++){
            int x = points[i].x;
            int y = points[i].y;
            int du = 0;
            count.clear();
            count[(double)INT_MIN] = 0;
            for(int j = 0 ; j < size ; j++){
                if(i != j){
                    int x1 = points[j].x;
                    int y1 = points[j].y;
                    if(x == x1 && y == y1){
                        du++;
                    }else if(x == x1){
                        count[(double)INT_MAX] ++;
                    }else{
                        double k = (double)(y1-y) / (double)(x1-x);
                        count[k]++;
                    }
                }
            }
            
            for(auto it = count.begin() ; it != count.end() ; it++){
                if(it -> second + du> ans){
                    ans = it -> second + du;
                }
            }
            
        }
        return ans + 1;
    }
};