同一直线最大点数问题

原题:
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
即:给定二维平面中的n点,求过同一直线的点最多的点

分析:
可以通过双重循环遍历。第一层循环遍历不同的点作为主导点,第二层循环遍历剩下的点,考虑其斜率。有几个细节:

  1. 统计斜率和点的数量可以用HashMap
  2. 需要考虑斜率不存在的情况
  3. 需要考虑点重合的情况,同一点不重复计数
import java.util.*;

class Point {
    int x;
    int y;
    Point() { x = 0; y = 0; }
    Point(int a, int b) { x = a; y = b; }
}
public class MaxPointsOnOneLine {
    
    public int maxPoints(Point[] points) {
        int n = points.length;
        if(n < 2) return n;
         
        int ret = 0;
        for(int i = 0; i < n; i++) {
            // 分别统计与点i重合以及垂直的点的个数
            int dup = 1, vtl = 0;
            Map<Float, Integer> map = new HashMap<>();
            Point a = points[i];
             
            for(int j = 0; j < n; j++) {
                if(i == j) continue;    //同一个点
                Point b = points[j];
                if(a.x == b.x) {
                    if(a.y == b.y) dup++;//重叠的点
                    else vtl++;         //垂直的点
                } else {                //一般情况,根据斜率划分
                    float k = (float)(a.y - b.y) / (a.x - b.x);
                    if(map.get(k) == null) map.put(k, 1);
                    else map.put(k, map.get(k) + 1);
                }
            }
             
            int max = vtl;          //初始化为垂直的点
            for(float k: map.keySet()) {
                max = Math.max(max, map.get(k));
            }
            ret = Math.max(ret, max + dup);//ret需要加上本身的点
        }
        return ret;
    }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,768评论 0 33
  • 世界上当然没有什么东西是理所应当的,我想谁都会认可这一点。 周末的时候,混蛋姐跟我说:“可能是我平时待我的一个舍友...
    小鹿大大王阅读 1,539评论 0 5
  • Today is Wednesday. The Journey to The West, one of the F...
    Mr_Oldman阅读 229评论 0 0
  • 昨天接到了大学好朋友的电话,主题就是,她男朋友和房东吵架之后动手打架了,110,一地鸡毛。朋友哭泣着断断续续的叙说...
    林声声莫听阅读 254评论 0 0
  • 一、有时候在用导航控制器跳转界面时会发生卡顿现象,解决办法很SB,就是在要跳转的控制器添加背景颜色就可以解决!!!...
    _源计划阅读 140评论 0 0