给一个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; } }
没有评论:
发表评论