max-points-on-a-line.md

2018-09-24  本文已影响0人  wymhuster

1、题目

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

2、解法

2.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.HashMap;
class PointAndK{
    int x;
    int y;
    double k;
    PointAndK(int a,int b,double c){
        x = a;y = b;k = c;
    }
}
public class Solution {
    public int maxPoints(Point[] points) {
        HashMap<Integer,Integer> horizontal = new HashMap<>();
        HashMap<Integer,Integer> vertical = new HashMap<>();
        HashMap<PointAndK,Integer> other = new HashMap<>();
        for(Point point:points){
            horizontal.put(point.y,0);
            vertical.put(point.x,0);
        }
        for(int i = 0;i<points.length;i++){
            for(int j = 0;j<points.length&&i!=j;j++){
                int x = points[i].x-points[j].x;
                int y = points[i].y-points[j].y;
                if(x!=0 && y!= 0){
                    double k = y*1.0/x;
                    other.put(new PointAndK(points[i].x,points[i].y,k),0);
                }
            }
        }
        for(PointAndK p:other.keySet()){
            for(Point point:points){
                int x = p.x-point.x;
                int y = p.y-point.y;
                if(x!=0&&y!=0){
                    double k = y*1.0/x;
                    if(Double.doubleToLongBits(k) == Double.doubleToLongBits(p.k)){
                        int val = other.get(p);
                        other.put(p,val+1);
                    }
                }else if(x == 0 && y == 0){
                    int val = other.get(p);
                    other.put(p,val+1);
                }
            }
        }
        for(Point point:points){
            int v1 = horizontal.get(point.y);
            horizontal.put(point.y,v1+1);
            int v2 = vertical.get(point.x);
            vertical.put(point.x,v2+1);
        }
        int result1 = getMaxCount(horizontal);
        int result2 = getMaxCount(vertical);
        int result3 = 0;
        for(PointAndK p:other.keySet()){
            if(other.get(p)>result3){
                result3 = other.get(p);
            }
        }
        return Math.max(result1,Math.max(result2,result3));
    }
 
    public int getMaxCount(HashMap<Integer,Integer> map) {
        int result = 0;
        for (Integer key : map.keySet()) {
            if (map.get(key) > result) {
                result = map.get(key);
            }
        }
        return result;
    }
     
     
}

2.2、别人的解法

public class Solution {
    public int maxPoints(Point[] points) {
        //关键在于判断三点共线,两平行直线有且只有一个交点,所以有一个中间点,这个中间点与另外两个端点的连线的斜率相等
        //由比率的性质
        int ABx;
        int ABy;
        int BCx;
        int BCy;

        if(points.length<=2) return points.length;
        int max=2;//用来记录最大个数

        for(int i=0;i<points.length;i++){
            int num=0;
            int temp=1;

            for(int j=i+1;j<points.length;j++){
                ABx=points[i].x-points[j].x;
                ABy=points[i].y-points[j].y;
                if(ABx==0 && ABy==0)//表示出现重复点
                {
                    num++;
                }else{
                    temp++;
                    for(int k=j+1;k<points.length;k++){
                        BCx=points[j].x-points[k].x;
                        BCy=points[j].y-points[k].y;
                        if(ABx*BCy==BCx*ABy){//表示两个斜率相等,转化为乘积的形式可以避免分母为0的情况
                            temp++;
                        }
                    }
                }
                if(max<(num+temp)){
                  max=num+temp;
                }
                temp=1;
            }

        }
        return max;
    }
}

笔记上是别人的代码,这段代码通过三层for循环来求解,并且没有使用hashmap。比自己的答案要精炼很多

上一篇下一篇

猜你喜欢

热点阅读