max-points-on -a-line

来源:互联网 发布:温度测试仪软件 编辑:程序博客网 时间:2024/06/05 12:00

问题描述:

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


java方案:


需要两重循环,第一重循环遍历起始点a,第二重循环遍历剩余点b。
 
    a和b如果不重合,就可以确定一条直线。
 
    对于每个点a,构建 斜率->点数 的map。
 
    (1)b与a重合,以a起始的所有直线点数+1 (用duplicate统一相加)
 
    (2)b与a不重合,a与b确定的直线点数+1

/** * 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) {        int result=0;        if(points.length==0){        return 0;        }        if(points.length==1){        return 1;        }        for(int i=0;i<points.length;i++){        int curmax=1;int duplicate=0;        int veticalpoint=0;        Map<Double,Integer> mp=new HashMap<Double,Integer>();        Point a=points[i];                for(int j=0;j<points.length;j++){        if(j==i)continue;                Point b=points[j];        double x1=b.x-a.x;        double y1=b.y-a.y;        if(x1==0&&y1==0){//点重合了        duplicate++;              }else if(x1==0){//垂直线段上的点,两者顺序不能反,必须先判断重合在判断垂直        if(veticalpoint==0)veticalpoint=2;        else veticalpoint++;        curmax=max(curmax,veticalpoint);        }        else {        Double k=y1/x1;        if(mp.get(k)==null)mp.put(k, 2);        else{mp.put(k, mp.get(k)+1);}        curmax=max(curmax,mp.get(k));        }                }                        result=max(result,curmax+duplicate);                }        return result;    }     public int max(int a,int b){ return a>b?a:b; }}






原创粉丝点击