题目:

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

链接: http://leetcode.com/problems/max-points-on-a-line/

题解:

这道题是旧时代的残党,LeetCode大规模加新题之前的最后一题,新时代没有可以载你的船。要速度解决此题,之后继续刷新题。

主要思路是,对每一个点求其于其他点的斜率,放在一个HashMap中,每计算完一个点,尝试更新global max。

要注意的一些地方是 -

  • 跳过当前点
  • 处理重复
  • 计算斜率的时候使用double
  • 保存斜率时,第一次要保存2个点,并非1个
  • 假如map.size() = 0, 这时尝试用比较max和 duplicate + 1来更新max

Time Complexity - O(n2), Space Complexity - O(n)

/**
* 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 == null || points.length == 0)
return 0;
HashMap<Double, Integer> map = new HashMap<>();
int max = 1; for(int i = 0; i < points.length; i++) { //for each point, find out slopes to other points
map.clear();
int duplicate = 0; //dealing with duplicates for(int j = 0; j < points.length; j++) {
if(j == i)
continue;
if(points[i].x == points[j].x && points[i].y == points[j].y) {
duplicate++;
continue;
} double slope = (double)(points[j].y - points[i].y) / (double)(points[j].x - points[i].x); if(map.containsKey(slope)) {
map.put(slope, map.get(slope) + 1);
} else
map.put(slope, 2);
} if(map.size() > 0) {
for(int localMax : map.values())
max = Math.max(max, localMax + duplicate);
} else
max = Math.max(max, duplicate + 1);
} return max;
}
}

二刷:

又做到了这一题。题目很短,很多东西没有说清楚。比如假如这n个点中有重复,这重复的点我们也要算在结果里。比如[0, 0][0, 0]这是两个点。

这回用的方法依然是双重循环,使用一个Map<Double, Integer>来记录每个点到其他点的斜率slope,然后每统计完一个点,我们尝试更新一下globalMax。这里有几点要注意:

  1. 有重复点的情况,这时候我们用一个整数dupPointNum来记录,并且跳过后面的运算
  2. 斜率
    1. 当点p1.x == p2.x时这时我们要设置slope = 0.0,否则map里可能会出现-0.0和0.0两个key
    2. 当点p1.y == p2.y的时候,我们要设置slope = Double.POSITIVE_INFINITY,否则map里可能出现Double.POSITIVE_INFINITY或者Double.NAGETIVE_INFINITY
    3. 其他情况我们可以使用直线的两点式方程算出斜率slope = (double)(p1.y - p2.y) / (p1.x - p2.x)
  3. 计算完一个点之后,我们遍历Map的value()集,跟globalMax比较,尝试更新

有意思的一点是Double.NaN虽然不等于Double.NaN,即(Double.NaN == Double.NaN)返回false。但作为map的key来说却能在查找时返回true,所以2.2也可以设置slope = Double.NaN.

Java:

Time Complexity - O(n2), Space Complexity - O(n)

/**
* 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 == null || points.length == 0) return 0;
Map<Double, Integer> map = new HashMap<>(points.length);
int max = 0, len = points.length; for (int i = 0; i < len; i++) {
map.clear();
int dupPointNum = 0;
for (int j = i + 1; j < len; j++) {
if (points[i].x == points[j].x && points[i].y == points[j].y) {
dupPointNum++;
continue;
}
double slope = 0.0;
if (points[j].y == points[i].y) slope = 0.0;
else if (points[j].x == points[i].x) slope = Double.POSITIVE_INFINITY;
else slope = (double)(points[j].y - points[i].y) / (points[j].x - points[i].x); if (map.containsKey(slope)) map.put(slope, map.get(slope) + 1);
else map.put(slope, 2);
}
max = Math.max(max, dupPointNum + 1);
for (int count : map.values()) max = Math.max(max, count + dupPointNum);
}
return max;
}
}

Update:

加入了排序去重,速度更快了一些。

/**
* 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 == null || points.length == 0) return 0;
Arrays.sort(points, (Point p1, Point p2)-> (p1.x != p2.x) ? p1.x - p2.x : p1.y - p2.y);
Map<Double, Integer> map = new HashMap<>(points.length);
int max = 0, len = points.length; for (int i = 0; i < len; i++) {
if (i > 0 && points[i].x == points[i - 1].x && points[i].y == points[i - 1].y) continue;
map.clear();
int dupPointNum = 0;
for (int j = i + 1; j < len; j++) {
if (points[i].x == points[j].x && points[i].y == points[j].y) {
dupPointNum++;
continue;
}
double slope = 0.0;
if (points[j].y == points[i].y) slope = 0.0;
else if (points[j].x == points[i].x) slope = Double.POSITIVE_INFINITY;
else slope = (double)(points[j].y - points[i].y) / (points[j].x - points[i].x); if (map.containsKey(slope)) map.put(slope, map.get(slope) + 1);
else map.put(slope, 2);
}
max = Math.max(max, dupPointNum + 1);
for (int count : map.values()) max = Math.max(max, count + dupPointNum);
}
return max;
}
}

Reference:

https://leetcode.com/discuss/72457/java-27ms-solution-without-gcd

https://leetcode.com/discuss/57464/accepted-java-solution-easy-to-understand

149. Max Points on a Line的更多相关文章

  1. 【LeetCode】149. Max Points on a Line

    Max Points on a Line Given n points on a 2D plane, find the maximum number of points that lie on the ...

  2. [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 line. ...

  3. Java for 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 line. ...

  4. 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. ...

  5. leetcode 149. Max Points on a Line --------- java

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

  6. 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 ...

  7. 149 Max Points on a Line 直线上最多的点数

    给定二维平面上有 n 个点,求最多有多少点在同一条直线上. 详见:https://leetcode.com/problems/max-points-on-a-line/description/ Jav ...

  8. [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 line. ...

  9. [LC] 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 line. ...

随机推荐

  1. .Net获取iis版本

    有以下办法获取iis版本. DirectoryEntry getEntity = new DirectoryEntry("IIS://localhost/W3SVC/INFO"); ...

  2. C# 打印多页tif

    注意点: 1.计算image对象总页数 image.GetFrameCount(FrameDimension.Page); 2.初始化当前页,并获取指定页内容 image.SelectActiveFr ...

  3. PL/SQL Developer 使用中文条件查询时无数据的解决方法

    PL/SQL Developer 使用中文条件查询时无数据,这是由于字符集的不一致导致的. 执行以下sql命令:select userenv('language') from dual; 显示:SIM ...

  4. 10_HTTP协议_入门知识

    [什么是HTTP协议] 对 浏览器客户端 和  服务器端之间的数据传输的格式规范. 客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵循一定的通讯格式,HTTP协议用于定义客户端与 ...

  5. [Guava官方文档翻译] 2.使用和避免使用null (Using And Avoiding Null Explained)

    本文地址:http://www.cnblogs.com/hamhog/p/3536647.html "null很恶心." -Doug Lea "这是一个令我追悔莫及的错误 ...

  6. nodejs的cs模式聊天客户端和服务器实现

    学习完nodejs的基础后,自然要写点东西练练手,以下是一个基于nodejs的cs模式的聊天软件代码: net模块是nodejs的网络编程必定用到的一个模块,对socket通信进行了封装 实现的功能: ...

  7. 在Mac OS X中使用VIM开发STM32(3)

    本文原创于http://www.cnblogs.com/humaoxiao,非法转载者请自重!       在上一篇文章中,我们安装了ctags插件,ctags能对我们的源代码文件中的元素建立索引表, ...

  8. Linux下的I/O复用与epoll详解

    前言 I/O多路复用有很多种实现.在linux上,2.4内核前主要是select和poll,自Linux 2.6内核正式引入epoll以来,epoll已经成为了目前实现高性能网络服务器的必备技术.尽管 ...

  9. Windows 8上强制Visual Studio以管理员身份运行

    原文链接:http://edi.wang/post/2013/2/28/force-visual-studio-always-run-as-admin-on-windows-8 Windows 8的一 ...

  10. 安装mvc3出错致命错误

    给vs2010安装mvc3,出现如下错误提示: Installation failed with error code: (0x80070643), "安装时发生严重错误 ". 将 ...