[LeetCode]Maximum number of points on a straight line in 2d plane

From Here

Solution:

Remember that a line can be represented by y=kx+d, if p1 and p2 are in same line, then y1=x1k+d, y2=kx2+d, so y2-y1=kx2-kx1, so k=(y2-y1)/(x2-x1), then we can apply this formula to check if two points are in same line, however how to handle the duplicate points problem?

So instead to calculate the line with maximum points , we should calculate longest line(maximum ponts) through same point,

public class Solution {

     public  int maxPoints(Point[] points) {

            if (points==null||points.length==0){
                return 0;
            }  

            HashMap<Double, Integer> map=new HashMap<Double, Integer>();;
            int max=1;

            for(int i=0; i<points.length; i++){
                // shared point changed, map should be cleared and server the new point
                map.clear();

                // maybe all points contained in the list are same points,and same points' k is 
                // represented by Integer.MIN_VALUE
                map.put((double)Integer.MIN_VALUE, 1);

                int dup=0;

                for(int j=i+1; j<points.length; j++){
                   if (points[j].x==points[i].x&&points[j].y==points[i].y){
                       dup++;
                       continue;
                   }

                   // look 0.0+(double)(points[j].y-points[i].y)/(double)(points[j].x-points[i].x)
                   // because (double)0/-1 is -0.0, so we should use 0.0+-0.0=0.0 to solve 0.0 !=-0.0
                   // problem

                   // if the line through two points are parallel to y coordinator, then K(slop) is 
                   // Integer.MAX_VALUE
                   double key=points[j].x-points[i].x==0?Integer.MAX_VALUE:0.0+(double)(points[j].y-points[i].y)/(double)(points[j].x-points[i].x);

                   if (map.containsKey(key)){
                       map.put(key, map.get(key)+1);
                   }
                   else{
                      map.put(key, 2);
                   }
               }

              for (int temp: map.values()){
                  // duplicate may exist
                  //all duplicate of the cur point are on the same line
                  if (temp+dup>max){
                      max=temp+dup;
                  }
              }

            }

            return max;
        }
}

转载于:https://www.cnblogs.com/jxlgetter/p/4395084.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
LeetCode是一个面向编程准备面试的在线平台,它提供了各种编程题目来帮助开发人员提高算法和数据结构的能力。下面是一个使用Java进行LeetCode刷题的指南: 1. 熟悉题库:首先,你需要熟悉LeetCode的题库。了解各种类型的题目,比如数组、字符串、链表、树等等,并了解它们对应的解决方法。 2. 制定计划:根据自己的时间和能力安排一个刷题计划,每天或每周刷一定数量的题目。有计划地刷题可以保证你的学习进度。 3. 注重基础:LeetCode要求高效的算法和数据结构知识,所以确保你掌握了一些基本的数据结构和算法,比如数组、链表、栈、队列、二叉树、图等等。 4. 解题过程:当你开始解题时,首先仔细阅读题目描述,并理解问题的要求。然后分析问题,尽量找到一种简单而高效的解决方案。 5. 编码实现:在理解和分析问题之后,使用Java编写代码来解决问题。编写简洁、高效的代码可以提高你的编码能力。 6. 测试和优化:编写测试用例来验证你的代码是否正确,并分析你的代码的时间复杂度和空间复杂度。根据测试结果,进行代码优化以提高性能。 7. 学习他人的解决方案:LeetCode上有很多高手,他们在解决问题时可能采用了一些巧妙的解决方案。阅读和学习他们的代码可以帮助你提高自己的解题能力。 8. 多实践,多思考:不仅仅完成题目,还需要总结经验和教训。多思考为什么这个解决方案是高效的,以及如何在其他类似问题上应用相同的思路。 通过遵循这个LeetCode刷题指南,你可以提高自己的算法和数据结构的能力,为面试做好准备。刷题不仅仅是为了通过面试,更是提升自己的编程技能和思维能力的一种训练。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值