leetcode149- Max Points on a Line- hard

Posted jasminemzy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode149- Max Points on a Line- hard相关的知识,希望对你有一定的参考价值。

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

 

考数学和抠细节。O(n2)。每对点都要遍历。先固定第一个点,从第一个点开始跟后面每个点计算斜率,存到斜率-计数的<Double,Integer>map里。每个点为起点的斜率遍历过了以后,打一下擂台(count + dup)。

细节:1.点重复(用dup计数,这个要加到所有斜率上面的)

2. 斜率为正无穷,用double(Integer.MAX_VALUE)计数

3. 斜率为0,用0计数(避免+-0情况)

4. 普通斜率(最好用GCD最小公倍数求一下然后存这个约分了的x-y-计数对而不是存斜率-计数对,map<Integer x,Map<Integer y,Integer cnt>>,因为这样能避免很近的大点问题,比如[0,0], [1000000,10000001],[10000001, 100000002]这种,但实现太麻烦了不做这个优化也行)

 

实现

/**
 * Definition for a point.
 * class Point {
 *     int x;
 *     int y;
 *     Point() { x = 0; y = 0; }
 *     Point(int a, int b) { x = a; y = b; }
 * }
 */
class Solution {
    public int maxPoints(Point[] points) {
        if (points == null) {
            return 0;
        }
        
        Map<Double, Integer> map = new HashMap<>();
        int dup = 0;
        int max = 0;
        for (int i = 0; i < points.length; i++) {
            map.clear();
            dup = 0;
            map.put((double)Integer.MIN_VALUE, 1);
            
            for (int j = i + 1; j< points.length; j++) {
                // 1. duplicate point
                if (points[i].x == points[j].x && points[i].y == points[j].y) {
                    dup++;
                    continue;
                }
                
                double slope;
                if (points[i].x == points[j].x) {
                    slope = (double)Integer.MAX_VALUE;
                } else if (points[i].y == points[j].y) {
                    slope = 0.0;
                } else {
                    slope = (double)(points[i].y - points[j].y) / (double)(points[i].x - points[j].x);
                }
                
                if (map.containsKey(slope)) {
                    map.put(slope, map.get(slope) + 1);
                } else {
                    map.put(slope, 2);
                }
            }
            for (int cnt : map.values()) {
                max = Math.max(max, cnt + dup);
            }
        }
        
        return max;
    }
}

 

 

 

以上是关于leetcode149- Max Points on a Line- hard的主要内容,如果未能解决你的问题,请参考以下文章

leetcode149 Max Points on a Line

LeetCode 149. Max Points on a Line

LeetCode 447. Number of Boomerangs; 149. Max Points on a Line

149 Max Points on a Line 直线上最多的点数

题目地址(149. 直线上最多的点数)

题目地址(149. 直线上最多的点数)