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


题解:

思路比较简单,每条直线都可以表示为y=kx+b,所以对于任意三点,如果它们共线,那么它们中任意两点的斜率都相等。

所以就遍历points数组,对其中的每一个元素计算它和位于它后面的数组元素的斜率并保存在一个hashmap中.

这个hashmap的键就是两点构成直线的斜率,值就是和当前元素points[i]斜率等于键值k的点有多少个。

比如map中如果有一个KV值为(2.5,3),说明和点points[i]构成的直线斜率为2.5的点有三个。

找到hashmap中最大的value值,加上和点points[i]重合的点的个数以及点points[i]自己,就得到了与点points[i]共线的点的最大值。

最后在所有的点中找到这个最大值中最大的,就是答案了。

代码如下:

 /**
* 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 {
public int maxPoints(Point[] points) {
if(points.length == 0)
return 0;
int answer = 0;
HashMap<Double,Integer> mp = new HashMap<Double,Integer>(); for(int i = 0;i < points.length;i++){
int duplicates = 0;
int value;
int count = 0;
mp.clear();
double k = 0.0;
for(int j = i+1;j <points.length;j++){ if(points[i].x == points[j].x && points[i].y == points[j].y){
duplicates++;
continue;
}
if(points[i].x == points[j].x)
k = (int)Double.POSITIVE_INFINITY;
else
k = (double)(points[j].y-points[i].y)/(points[j].x-points[i].x)+0.0;
if(mp.containsKey(k)){
value = mp.get(k) + 1;
}
else {
value = 1;
}
mp.put(k, value);
if(count < value)
count = value;
}
answer = Math.max(answer, count+duplicates+1);
}
return answer; }
}

虽然逻辑很简单,但是这道题细节非常烦人,对于刚入java门的我来说,还是花了一上午时间=。=,主要有以下几点:

1.map的声明:

HashMap<Double,Integer> mp = new HashMap<Double,Integer>();

2.map中更新value的方法:重新放入一个<key,new_value>覆盖以前的<key,old_value>即可;

3.对于横坐标相等的点,它们构成的直线斜率是无穷,要用Double.POSITIVE_INFINITY单独处理;

4.计算得到的斜率中,有两个非常特殊的值-0.0和0.0,理论上这两个值是相等的,都是零,但是java会判定这两个值不想等,所以要对-0.0做一个特殊处理,加上一个0.0就可以了。

【leetcode刷题笔记】Max Points on a Line的更多相关文章

  1. LeetCode刷题笔记和想法(C++)

    主要用于记录在LeetCode刷题的过程中学习到的一些思想和自己的想法,希望通过leetcode提升自己的编程素养 :p 高效leetcode刷题小诀窍(这只是目前对我自己而言的小方法,之后会根据自己 ...

  2. 18.9.10 LeetCode刷题笔记

    本人算法还是比较菜的,因此大部分在刷基础题,高手勿喷 选择Python进行刷题,因为坑少,所以不太想用CPP: 1.买股票的最佳时期2 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. ...

  3. LeetCode刷题笔记 - 12. 整数转罗马数字

    学好算法很重要,然后要学好算法,大量的练习是必不可少的,LeetCode是我经常去的一个刷题网站,上面的题目非常详细,各个标签的题目都有,可以整体练习,本公众号后续会带大家做一做上面的算法题. 官方链 ...

  4. Leetcode刷题笔记(双指针)

    1.何为双指针 双指针主要用来遍历数组,两个指针指向不同的元素,从而协同完成任务.我们也可以类比这个概念,推广到多个数组的多个指针. 若两个指针指向同一数组,遍历方向相同且不会相交,可以称之为滑动窗口 ...

  5. LeetCode(149) Max Points on a Line

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

  6. LeetCode刷题笔记(1-9)

    LeetCode1-9 本文更多是作为一个习题笔记,没有太多讲解 1.两数之和 题目请点击链接 ↑ 最先想到暴力解法,直接双循环,但是这样复杂度为n平方 public int[] twoSum(int ...

  7. leetcode刷题笔记

    (1)Best Time to Buy and Sell Stock Total Accepted: 10430 Total Submissions: 33800My Submissions Say ...

  8. leetcode刷题笔记08 字符串转整数 (atoi)

    题目描述 实现 atoi,将字符串转为整数. 在找到第一个非空字符之前,需要移除掉字符串中的空格字符.如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即 ...

  9. LeetCode 刷题笔记 (树)

    1.  minimum-depth-of-binary-tree 题目描述 Given a binary tree, find its minimum depth.The minimum depth ...

随机推荐

  1. DevOps开源工具的三种分类整理

    原文地址:http://www.360doc.com/content/16/0322/07/31263000_544210096.shtml 随着开发运维一体化的DevOps运动在国内外蓬勃发展,De ...

  2. Expression构建DataTable to Entity 映射委托 sqlserver 数据库里面金额类型为什么不建议用float,实例告诉你为什么不能。 sql server 多行数据合并成一列 C# 字符串大写转小写,小写转大写,数字保留,其他除外 从0开始用U盘制作启动盘装Windows10系统(联想R720笔记本)并永久激活方法 纯CSS打造淘宝导航菜单栏 C# Winform

    Expression构建DataTable to Entity 映射委托   1 namespace Echofool.Utility.Common { 2 using System; 3 using ...

  3. tony_update yum

    更改方法是这样的 在 /etc/yum.repos.d 下 1  wget http://mirrors.163.com/.help/CentOS6-Base-163.repo 2  #mv  Cen ...

  4. 使用 yarn 作为 Npm 的代替方案

    相关传送门: # window 安装包下载https://yarnpkg.com/zh-Hans/docs/install#windows-stable # yarn官方网站 https://yarn ...

  5. Atitit.sql ast 表达式 语法树 语法 解析原理与实现 java php c#.net js python

    Atitit.sql ast 表达式 语法树 语法 解析原理与实现 java php c#.net js python 1.1. Sql语法树 ast 如下图锁死1 2. SQL语句解析的思路和过程3 ...

  6. java.io.IOException: Illegal partition for 67 (-1)

    今天写MapReduce的分区进行排序的功能,自己写了一个Partitioner,然后用的时候就错了 public static class MyPartition extends Partition ...

  7. MapReudce源码分析之Mapper

    Mapper是MapReduce编程模型中一个将输入的key/value对映射成一组中间key/value对的组件.Map是将输入记录转换成中间记录的单个任务.被转换的中间记录不需要与输入记录一样的类 ...

  8. java学习笔记之String.Split方法

    hello 大家好,好久不见,今天 我们要讨论的是java的split方法,或许你很早就知道了,但你真的知道吗? 我们来看看吧. 首先我们来看看我们最常用的split()方法也就是单个参数的方法 pu ...

  9. android EditText控制最大输入行数

    网络摘抄,仅作记录学习 EditText在android开发中是一个经常用到的基础控件,功能也很强大,限制输入字符类型,字数什么的.但是最近在工作中遇到了需要控制editText最大可输入行数的要求. ...

  10. ViewPage + Fragment 防止Fragment 重复加载问题

    @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanc ...