leetcode----对于给定的n个位于同一二维平面上的点,求最多能有多少个点位于同一直线上

import java.util.*;

/*
 * public class Point {
 *   int x;
 *   int y;
 * }
 */

public class Solution {
    /**
     * 
     * @param points Point类一维数组 
     * @return int整型
     * 计算 二维平面上,最多有多少个点位于同一直线上
      思路:MAX记录位于同一直线上最多的点数
          遍历所有的点
              1.记录与当前点结合 斜率不存在的点数,即垂直于x轴的点 n1
              2.重复出现的点数,即与当前点相同的点 n2
              3.记录与当前点结合,每个斜率下的点数(斜率存在) n3
           每次遍历,选出3和1情况下,同一斜率下,最多的点数max;
                   将 max+重复点数n2  与当前最多的点数MAX比较(最后需要加上当前比较的点)
     */
    public int maxPoints (Point[] points) {
        // write code here
        int len = points.length;
        if(len<=2){
            return len;
        }
        int MAX=0;
        for(int i=0;i<len;i++){//遍历每一个点
            int n1=0,n2=0,n3=0;
            Map<Float,Integer> map = new HashMap<Float,Integer>(); //键:斜率; 值:该斜率下与点i结合的点数 
            for(int j=0;j<len;j++){//遍历其它点,计算其他点与点i的斜率
                if(i==j){//1.跳过本次循环
                    continue;
                }
                if(points[i].x==points[j].x){        
                    if(points[i].y==points[j].y){//2.点j与当前点i重合
                        n2++;
                    }else{//3.点j与点i在同一条垂直于x轴的直线上,即斜率不存在
                        n1++;
                    }
                }else{//4.正常情况下,计算其它点与点i结合后,不同斜率下点的个数
                    float k = (float)(points[i].y-points[j].y)/(points[i].x-points[j].x);//斜率(不要忘记强转为float型)
                    if(map.get(k)==null){//当前斜率下,第一次出现
                        map.put(k,1);
                    }else{//否则,更新斜率出现的次数
                        map.put(k,map.get(k)+1);
                    }
                }//else
            }//for
            //5.通过比较,获取与点i在同一条直线上,最多的点数
            int max = n1;
            for(float f:map.keySet()){//遍历集合中,所有斜率下的点数。获取出现次数最多的点
                max = Math.max(max,map.get(f));
            }
            MAX = Math.max(MAX,max+n2); //需加上重复出现的点数n2 
        }//for
        return MAX+1;//加上当前的这个点
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值