leetcode 149 平面上直线最多的点

终于在LeetCode上ac,呜呜呜暴风哭泣

这个题目就是传说中看起来很简单,实际上会因为自己逻辑的漏洞错很多的题目。由于直接求斜率有可能因为double精度的问题判断出现错误。在别人的启发下,用乘法就可以很好的解决这个问题,不用因为double精度的问题导致判断错误。但是由于乘法,有些用例会导致溢出,所以要将之变成long型。

这里的特殊情况就只有重合点的问题了,因为变成乘法不用考虑除数为0的问题了。与初始点重合的选取的第二个点一定要进行保存,不然就会导致丢失前面的点。

class Solution {
	public int maxPoints(int[][] points) {
		int count = points.length;
		int max = 0;
		int tmp = 0;
        int dup = 0;
		for (int i = 0; i < count; i++) {
			tmp = 1;
            dup = 0;
            for(int j=i+1;j<count;j++){
                if(points[i][0] == points[j][0] && points[i][1] == points[j][1]){
                    dup++;
                    continue;
                }
                tmp++;
                long  k2y =(long)(points[j][1]-points[i][1]);
                long k2x =(long) (points[j][0]-points[i][0]);

                for(int k=j+1;k<count;k++){
                      if(((points[k][0] == points[j][0] && points[k][1] == points[j][1]))||((points[k][0] == points[i][0] && points[k][1] == points[i][1]))){
                        tmp++;
                        continue;
                    }
                    else{
                       long k1y = points[k][1]-points[j][1];
                        long k1x = points[k][0]-points[j][0];

                        if(k2y*k1x == k1y*k2x){
                            tmp++;
                        }   
                    }
                 }
                if(max<tmp+dup){
                    max = tmp+dup;
                }
                tmp = 1;
            }
           if(max<tmp+dup){
                max = tmp+dup;
           }
            
         }				
		return max;

	}
	
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值