Leetcode Max Points on a Line

来源:互联网 发布:数据分析师专业 编辑:程序博客网 时间:2024/06/05 02:51

Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.

Difficulty: Hard


Solution: Traverse every pair of points, if their slope are the same, they will be on the same line. Build a hashtable to record it.


/** * Definition for a point. * class Point { *     int x; *     int y; *     Point() { x = 0; y = 0; } *     Point(int a, int b) { x = a; y = b; } * } */ import java.util.Hashtable; import java.util.Enumeration;public class Solution {    public int maxPoints(Point[] points) {        int res = 0;        if(points.length == 0)            return 0;        if(points.length == 1)            return 1;        if(points.length == 2)            return 2;        for(int i = 0; i < points.length - 1; i++){            int x1 = points[i].x;            int y1 = points[i].y;            Hashtable<Double, Integer> maps = new Hashtable<Double, Integer>();            //Hashtable<double, Integer> maps = new Hashtable<double, Integer>();            int ver = 0, par = 0;            int general = 0;            for(int j = i + 1; j < points.length; j++){                if(x1 == points[j].x && y1 == points[j].y){                    general++;                    continue;                }                if(x1 == points[j].x){                    ver++;                    continue;                }                if(y1 == points[j].y){                    par++;                    continue;                }                double k = ((double)(points[j].y - y1)) / ((double)(points[j].x - x1));                if(!maps.containsKey(k)){                    maps.put(k, 1);                }                else{                    maps.put(k, maps.get(k) + 1);                }            }                        Enumeration<Double> enumKey = maps.keys();            int ans = 0;            while(enumKey.hasMoreElements()) {                double key = enumKey.nextElement();                int val = maps.get(key);                ans = Math.max(val, ans);            }            ans = Math.max(ans, ver);            ans = Math.max(ans, par);            res = Math.max(ans + general + 1, res);                    }        return res;    }}


0 0