leetode(NOWCODER)---max-points-on-a-line

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ccnuacmhdu/article/details/85146693

时间限制:1秒 空间限制:32768K 热度指数:62942
本题知识点: 穷举 leetcode

题目描述

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

思路
穷举每个点的每个斜率。。

/**
 * 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.*;
public class Solution {
    public int maxPoints(Point[] points) {
        //暴力计算下,统计出所有的斜率情况,算出每种斜率对应的点数,取最大值
        //暴力枚举每个点,其他点要么与该点重合,要么与该点连接的直线斜率不存在,要么与该点连接的斜率存在
        //浮点运算可能产生精度误差问题,最好HashMap不要用浮点数作为键
        
        if(points == null){
            return 0;
        }
        if(points.length <= 2){
            return points.length;
        }
        
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        int result = 0;
        for(int i = 0; i < points.length; i++){
            int repetition = 0;
            int kNotExist = 0;
            int maxCnt = 1;//初始化为1,因为至少当前的这个点i有一个点啊
            for(int j = 0; j < points.length; j++){
                if(i != j){
                    int dx = points[i].x - points[j].x;
                    int dy = points[i].y - points[j].y;
                    //1.如果i,j重合
                    if(dx == 0 && dy == 0){
                        repetition++;
                    }else if(dx == 0 && dy != 0){//2.如果i,j连接的直线斜率不存在
                        if(kNotExist == 0){
                            kNotExist = 2;
                        }else{
                            kNotExist++;
                        }
                        maxCnt = Math.max(maxCnt, kNotExist);
                    }else{//3.斜率存在
                        int g = gcb(dy, dx);
                        String k = (dy/g) + "/" + (dx/g);
                        if(map.get(k) == null){
                            map.put(k, 2);
                        }else{
                            map.put(k, map.get(k)+1);
                        }
                        maxCnt = Math.max(maxCnt, map.get(k));
                    }
                }
            }
            result = Math.max(result, maxCnt+repetition);
            map.clear();
        }
        return result;
    }
    private int gcb(int a, int b){
        return b==0?a:(gcb(b,a%b));
    }
}

猜你喜欢

转载自blog.csdn.net/ccnuacmhdu/article/details/85146693