LintCode最多有多少个点在一条直线上

给出二维平面上的n个点,求最多有多少点在同一条直线上。

这道题搞得我非常恼火,很早以前就做出来了,一直都是WA,但是我一直找不到算法的问题,今天突然灵机一动,给我找到问题所在了,原来的代码是这样的:

/**
 * Definition for a point.
 * class Point {
 *     int x;
 *     int y;
 *     Point() { x = 0; y = 0; }
 *     Point(int a, int b) { x = a; y = b; }
 * }
 */
public class Solution {
    /**
     * @param points an array of point
     * @return an integer
     */
    public int maxPoints(Point[] points) {
        // Write your code here
        if (points==null){
            return 0;
        }else if(points.length==0||points.length==1||points.length==2){
            return points.length;
        }else
        {
            int max = 0;
            int count;
            double[] result;
            for (int i =0;i<points.length;i++)
            {
                for(int j=i+1;j<points.length;j++)
                {
                    count = 0;
                    if(points[i].x==points[j].x)
                    {
                        for(int m=0;m<points.length;m++)
                        {
                            if (points[m].x==points[i].x)
                                count++;
                        }
                    }
                    else
                    {
                        result = calcF(points[i],points[j]);
                        for(int k =0;k<points.length;k++)
                        {
                            if(result[0]*points[k].x+result[1]==(double)points[k].y)
                                count++;
                        }
                    }
                    max=count>max?count:max;
                }
            }
            return max;
        }
    }
    public double[] calcF(Point a,Point b){
        double[] i =new double[2];
        i[0]=(double)(a.y-b.y)/(double)(a.x-b.x);
        i[1]=(double)a.y-(double)a.x*i[0];
        return i;
    }
}

原理很简单,每个点两两之间计算斜率和截距,算出直线方程,再把每个点往方程里套。符合方程的即在一条直线上,在求出最大值即可。
但是为什么错了呢?
原因就是:Double的精度问题!!!
由于计算机存储double无法保留足够的精度,所以在一长串double的显性转换中,精度丢失的很厉害。
在这里计算方程的时候不能按照原来数学上的直接把斜率和截距作为方程的参数了,为了保证精度,我们需要将斜率k写成diffY/diffX,然后为了在计算斜率时不作处罚,计算出的应该是diffX倍的斜率,最后calcF方程应写作:

int difX = points[i].x -points[j].x;
int difY = points[i].y -points[j].y;
int intercept = points[i].y*difX - points[i].x*difY;

最后套入判别式应该是:

for(int k =0;k<points.length;k++)
{
    if(points[k].x*difY + intercept == points[k].y * difX)
        count++;
}

这样所有参与运算的数都是整数,将不会存在精度问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容

  • 引言:运营是什么?三流玩产品,二流玩流量,一流玩用户。现在产品许许多多,而用户确是一成不变的,在互联网的潮流下,产...
    松鼠Jole阅读 501评论 3 7
  • 文/十一郎 1 “十一郎,你最近怎么回事,怎么老是心不在焉的样子?你看你做的这个工作总结,不是你的正常水平啊?”领...
    淘汽十一郎阅读 1,399评论 0 5
  • 迷离恍惚的夜被镜头蒙上一层淡淡的灰,所有人都是灰蒙蒙的,连同看电影的人也是灰蒙蒙的。我看见一根烟先亮起一个点,之后...
    养人阅读 117评论 0 0
  • 一、微信小常规 微信营销,大多数人最难适应的地方就是在其他平台上,电商或者是搜索引擎,都是花钱买流量,钱下去,效...
    嘿丶轩哥阅读 2,036评论 0 8