LeetCode—max-points-on-a-line(共线点的最大数量)—Java

该博客介绍了如何解决LeetCode上的一个问题——在2D平面上找到共线点的最大数量。通过遍历所有点组合,利用两点确定一条直线的原理,检查每对点是否共线。当遇到斜率相同时,使用HashMap存储斜率及其对应点的数量,以跟踪最大共线点数。最后,更新最大值并返回结果。特殊情况下,如点为空或只有两个点,返回相应数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

求二维平面上n个点中,最多共线的点数。

思路解析

遍历两层循环:第一层循环代表起始点,第二层循环代表第二个点,两点定线

特殊情况:

  • 点为空,长度为0,return 0
  • 只有两个点,return 2
  • 外层循环外面定义最大值max初始化为1,用来表示点的个数。因为非空,所以长度至少为1.

在外层循环里面

  • 需要定义每次的最大值,即与点 i 共线的最大值,还有重合的点的个数same。
  • 如果两点重合,same就加1,same表示重合的点
  • 如果斜率一样,那就共线,可以使用HashMap来存储<斜率,个数>,然后内层循环结束,就去找到最大值
  • 不要忘记每次找到最大值以后就要把same加上
  • 斜率是float类型,可以强制类型转换
  • HashMap.values()
  • HashMap.get()
  • HashMap.put(  ,   )

代码

/**
 * 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;
public class Solution {
    public int maxPoints(Point[] points) {  
        if(points==null || points.length==0){
            return 0;
        }
        if(points.length<=2){
            return points.length;
        }
        int max=1;
        for(int i=0;i<points.length;i++){
            HashMap<Float,Integer> hm = new HashMap<Float,Integer>();
            int same=0;
            int localmax=1;
            for(int j=0;j<points.length;j++){
                if(i==j)
                    continue;
                if(points[i].x==points[j].x && points[i].y==points[j].y){
                    same++;
                    continue;
                }
                float slope=((float)(points[i].y-points[j].y))/(points[i].x-points[j].x);
                if(hm.containsKey(slope))
                    hm.put(slope,hm.get(slope)+1);
                else
                    hm.put(slope,2);
            }
            for(Integer value:hm.values())
                localmax = Math.max(localmax,value);
            localmax+=same;
            max = Math.max(max,localmax);
        }
        return max;
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值