题目:
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
思路:
固定一点,计算每一条经过这个店的直线斜率,用一个hashmap记录。记录下最多的斜率个数。对每个点做一次这样的搜索,这样复杂度就是O(n^2)
(1)坐标相同的两个不同的点 算作2个点
(2)假如有5个坐标相同的点,和另外任意1点在一条直线上,5+1>max,则max=5+1;(最后一个if语句的作用)
/** * 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.length == 0) return 0; if(points.length == 1) return 1; int max = 0; for(int i = 0; i < points.length; i++) { HashMap<Float, Integer> hm = new HashMap<Float, Integer>(); int same = 0; for(int j = 0; j < points.length; j++) { if(i == j) continue; if(points[i].x == points[j].x && points[i].y == points[j].y) {same++; continue;} float slope = ((float)(points[i].y - points[j].y))/(points[i].x - points[j].x); if(hm.containsKey(slope)) hm.put(slope, hm.get(slope) + 1); else hm.put(slope, 2); } for(float k : hm.keySet()) { //遍历hashmap中key值的方法 hm.put(k, hm.get(k) + same); } for(int v : hm.values()) { //遍历hashmap中values值的方法 if(v > max) max = v; } if(same+1 > max) max = same+1; } return max; } }