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]共线的点的最大值。
最后在所有的点中找到这个最大值中最大的,就是答案了。
代码如下:
1 /** 2 * Definition for a point. 3 * class Point { 4 * int x; 5 * int y; 6 * Point() { x = 0; y = 0; } 7 * Point(int a, int b) { x = a; y = b; } 8 * } 9 */ 10 public class Solution { 11 public int maxPoints(Point[] points) { 12 if(points.length == 0) 13 return 0; 14 int answer = 0; 15 HashMap<Double,Integer> mp = new HashMap<Double,Integer>(); 16 17 for(int i = 0;i < points.length;i++){ 18 int duplicates = 0; 19 int value; 20 int count = 0; 21 mp.clear(); 22 double k = 0.0; 23 for(int j = i+1;j <points.length;j++){ 24 25 if(points[i].x == points[j].x && points[i].y == points[j].y){ 26 duplicates++; 27 continue; 28 } 29 if(points[i].x == points[j].x) 30 k = (int)Double.POSITIVE_INFINITY; 31 else 32 k = (double)(points[j].y-points[i].y)/(points[j].x-points[i].x)+0.0; 33 if(mp.containsKey(k)){ 34 value = mp.get(k) + 1; 35 } 36 else { 37 value = 1; 38 } 39 mp.put(k, value); 40 if(count < value) 41 count = value; 42 } 43 answer = Math.max(answer, count+duplicates+1); 44 } 45 return answer; 46 47 } 48 }
虽然逻辑很简单,但是这道题细节非常烦人,对于刚入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,布布扣,bubuko.com
时间: 2024-10-08 16:42:04