2015年6月26日星期五

Max Points on a Line leetcode

Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
给一个2d的平面, 所给的数据结构point代表一个点, 让找一条点最多的直线. 
对于一个点来说斜率相同的就在一条直线上, 所以遍历所有点i, 对于每个点再遍历一次, 得到所有的斜率存入hashmap key是斜率 value是此斜率上的点数, 如果key已经存在的话就value + 1 不存在就给value赋值2(一条线有两个点) 这里要注意因为遍历可能会出现跟i点相同的点(x, y 值都相同),对于这样的点他存在在i为起始的所有直线上 所以我们维护一个same来记录这样的点的个数.
最后value中的最大值加上same的个数就是每个i点的最多直线数目 比较每个i点得到最后的最多直线
注意: 第二次遍历不用从0开始遍历 直接从i开始遍历就可以 (后面的点就不用太回头看已经扫描过得点)因为如果此点和前边的点组成的线是最多的点 那么前边已经遍历过了
因为会出现slop = 0 或者slop = 无穷大 但是因为slop是double型数 所有的0 不相等 所以单独拿出来讨论


/**
 * Definition for a point.
 * class Point {
 *     int x;
 *     int y;
 *     Point() { x = 0; y = 0; }
 *     Point(int a, int b) { x = a; y = b; }
 * }
 */
public class Solution {
    public int maxPoints(Point[] points) {
        if (points == null || points.length == 0) {
            return 0;
        }
        int max = 1;
        for (int i = 0; i < points.length; i++) {
            HashMap<Double, Integer> hash = new HashMap<Double, Integer>();
            int localmax = 1;//最少一个点
            int same = 0;
            double slop = 0.0;
            for (int j = i + 1; j < points.length; j++) {
                if (points[j].x == points[i].x && points[j].y == points[i].y) {
                    same++;
                    continue;
                } 
                if (points[j].y == points[i].y) {
                    slop = 0.0;
                } else if (points[j].x == points[i].x) {
                    slop = (double) Integer.MAX_VALUE;
                } else {
                    slop = (double) (points[j].y - points[i].y) / (double)(points[j].x - points[i].x);
                }
                if (hash.containsKey(slop)) {
                    hash.put(slop, hash.get(slop) + 1);
                } else {
                    hash.put(slop, 2);
                }
            }
            for (Integer value : hash.values()) {
                localmax = Math.max(localmax, value);
            }
            localmax += same;
            max = Math.max(localmax, max);
        }
        return max;
    }
}

没有评论:

发表评论