求一条直线通过的最大点数

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

分析:固定一个点,遍历其余点,期间用一个HashMap记录两点斜率和斜率次数,求出局部最大值;然后再固定另一点,遍历其余点,.........,即两层循环,内层循环求出局部最大值,外层循环更新全局最大值。需要注意:1. 点重叠的情况 2. 直线垂直于x轴的情况 3. 正常情况 4. 斜率为-0.0的情况

Java代码:

    public int maxPoints(Point[] points) {
        if (points.length <= 2) {
            return points.length;
        }
        int max = 0;
        float k = 0f;
        for (int i = 0; i < points.length-1; i++) { // 全局最大值
            HashMap<Float, Integer> hm = new HashMap<Float, Integer>();
            hm.put(Float.MAX_VALUE, 0);
            int repoint = 0;
            for (int j = i+1; j < points.length; j++) { // 局部最大值,固定一个点
                if (points[i].x == points[j].x && points[i].y == points[j].y) { // 点重合
                    repoint++;
                }
                else if (points[i].x == points[j].x) { //垂直x轴
                    hm.put(Float.MAX_VALUE, hm.get(Float.MAX_VALUE)+1);
                }
                else {
                    k = (float)(points[i].y - points[j].y)/(points[i].x - points[j].x); //正常情况
                    if (k == -0.0) { // 出现-0.0
                        k = 0f;
                    }
                    if (!hm.containsKey(k)) {
                        hm.put(k, 1);
                    } else {
                        hm.put(k, hm.get(k)+1);
                    }
                }
            }
            for (Float d : hm.keySet()) {
                if(hm.get(d)+repoint+1 > max) {
                    max = hm.get(d)+repoint+1;
                }
            }
        }
        return max;
    }
时间: 2024-10-13 16:20:15

求一条直线通过的最大点数的相关文章

求两条直线(线段)的交点

转自: http://blog.csdn.net/dgq8211/article/details/7952825 如图,如何求得直线 AB 与直线 CD 的交点P? 以上内容摘自<算法艺术与信息学竞赛>. 思路就是利用叉积求得点P分线段DC的比,然后利用高中学习的定比分点坐标公式求得分点P的坐标. 看不懂的可以去复习下 定比分点 的知识. 1 #include <math.h> 2 #include <stdio.h> 3 #include <string.h&g

求两条直线的交点

CvPoint GetTwoLineCrossPoint(const int& x1, const int& y1, const int& x2, const int& y2, const int& x3, const int& y3, const int& x4, const int& y4) { //第一条直线的参数 double a0 = y1 - y2; double b0 = x2 - x1; double c0 = x1 * y2

UVA Lining Up (一条直线上最多的点数)

Description  Lining Up  ``How am I ever going to solve this problem?" said the pilot. Indeed, the pilot was not facing an easy task. She had to drop packages at specific points scattered in a dangerous area. Furthermore, the pilot could only fly over

149. Max Points on a Line *HARD* 求点集中在一条直线上的最多点数

Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. /** * Definition for a point. * struct Point { * int x; * int y; * Point() : x(0), y(0) {} * Point(int a, int b) : x(a), y(b) {} * }; */ class Solutio

Intersecting Lines--POJ1269(判断两条直线的关系 &amp;&amp; 求两条直线的交点)

http://poj.org/problem?id=1269 我今天才知道原来标准的浮点输出用%.2f   并不是%.2lf  所以wa了好几次 题目大意:   就给你两个线段 然后求这两个线段所在的直线的关系  有共线  平行  和相交 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<ctype.h> #include<math.h> #define N 200

AS3 求两条直线的交点

//粘贴到帧上运行即可 var p1Start:Point = new Point(0,0); var p1End:Point = new Point(50,50); var p2Start:Point = new Point(50,50); var p2End:Point = new Point(100,100); var p:Point = new Point(); trace(checkPoint()) function checkPoint() { if (p1Start.x == p1

poj1039——计算几何 求直线与线段交点,判断两条直线是否相交

poj1039——计算几何  求直线与线段交点,判断两条直线是否相交 Pipe Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9439   Accepted: 2854 Description The GX Light Pipeline Company started to prepare bent pipes for the new transgalactic light pipeline. During the de

求平面内两条直线的交点

The  and  coordinates of the point of intersection of two non-vertical lines can easily be found using the following substitutions and rearrangements. Suppose that two lines have the equations  and  where  and  are the slopes (gradients) of the lines

n条直线交点拟合求交点

直线方程的公式有以下几种形式: 斜截式:y=kx+b 截距式:x/a+y/b=1 两点式:(x-x1)/(x2-x1)=(y-y1)/(y2-y1) 一般式:ax+by+c=0(可以表达任意直线) 只要知道两点坐标,代入任何一种公式,都可以求出直线的方程 一般式方程在计算机领域的重要性 常用的直线方程有一般式 点斜式 截距式 斜截式 两点式等等.除了一般式方程,它们要么不能支持所有情况下的直线(比如跟坐标轴垂直或者平行),要么不能支持所有情况下的点(比如x坐标相等,或者y坐标相等).所以一般式方