*Max Points on a Line

题目:

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;
    }
}

 

posted @ 2016-01-17 06:27  Hygeia  阅读(169)  评论(0编辑  收藏  举报