Max Points on a Line

题目

答案

以下答案过不了这个test case
[[0,0],[94911151,94911150],[94911152,94911151]]

class Solution {
    public int maxPoints(Point[] points) {
        if(points.length < 2) return points.length;

        int globalMax = 0;
        for(int i = 0; i < points.length; i++) {
            Map map = new HashMap<>();
            Point p1 = points[i];
            int localMax = 0, samePoint = 0;

            for(int j = i + 1; j < points.length; j++) {
                Point p2 = points[j];
                int t = 0;
                // Derive k from 2 points
                double k = ((double)p2.y - (double)p1.y) / ((double)p2.x - (double)p1.x);
                k = k/1000;
                
                if(k == -0.0) k = 0;
                if(p1.x == p2.x && p1.y == p2.y) {
                    samePoint++;
                }
                else if(p1.x == p2.x) {
                    t = map.getOrDefault((double)Integer.MAX_VALUE, 0) + 1;
                    map.put((double)Integer.MAX_VALUE, t);
                }
                else {
                    t = map.getOrDefault(k, 0) + 1;
                    map.put(k, t);
                }
            }

            for(Map.Entry e : map.entrySet()) {
                double k = e.getKey();
                localMax = Math.max(localMax, e.getValue());
            }

            globalMax = Math.max(globalMax, localMax + samePoint + 1);
        }

        return globalMax;
    }
}

改良版

class Solution {
    public int gcm(int a, int b) {
        return b == 0 ? a : gcm(b, a % b); // Not bad for one line of code :)
    }

    public String asFraction(int a, int b) {
        int gcm = gcm(a, b);
        return (a / gcm) + "/" + (b / gcm);
    }

    public int maxPoints(Point[] points) {
        if(points.length < 2) return points.length;

        int globalMax = 0;
        for(int i = 0; i < points.length; i++) {
            Map map = new HashMap<>();
            Point p1 = points[i];
            int localMax = 0, samePoint = 0;

            for(int j = i + 1; j < points.length; j++) {
                Point p2 = points[j];
                int t = 0;

                if(p1.x == p2.x && p1.y == p2.y) {
                    samePoint++;
                }
                else if(p1.x == p2.x) {
                    t = map.getOrDefault("vert", 0) + 1;
                    map.put("vert", t);
                }
                else if(p1.y == p2.y) {
                    t = map.getOrDefault("horz", 0) + 1;
                    map.put("horz", t);
                }
                else {
                    // Derive k from 2 points
                    String k = "";
                    if(p2.y - p1.y != 0 && p2.x - p1.x != 0)
                        k = asFraction(p2.y - p1.y, p2.x - p1.x);
                    else
                        k = Integer.toString(p2.y - p1.y) + "/" + Integer.toString(p2.x - p1.x);
                    t = map.getOrDefault(k, 0) + 1;
                    map.put(k, t);
                }
            }

            for(Map.Entry e : map.entrySet()) {
                localMax = Math.max(localMax, e.getValue());
            }

            globalMax = Math.max(globalMax, localMax + samePoint + 1);
        }

        return globalMax;
    }
}

你可能感兴趣的:(Max Points on a Line)