zoukankan      html  css  js  c++  java
  • 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.

    标签 Hash Table Math
    类似题目 (M) Line Reflection
     
     
     

    思路:注意可能存在重合点,除去重合点,只要记录能够表示一条直线的(x0,y0),其中a=x1-x2和y1-y2的最大公约数,x0=(x1-x2)/a,y0=(y1-y2)/a。注意到对于特定的i0,只要第一次出现(x0,y0),那么在直线(x0,y0)的点的数量一定可以在i0下得到最大值,本质上就是比较每个i下第一次出现的(x0,y0)包含的点的数目。

    代码:

     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         HashMap<Integer, Map<Integer, Integer>> hashMap = new HashMap<Integer, Map<Integer, Integer>>();
    13         int res = 0, maxCount = 0, overlap = 0;
    14         for (int i = 0; i < points.length; ++i) {
    15             hashMap.clear();
    16             maxCount = overlap = 0;
    17             for (int j = i + 1; j < points.length; j++) {
    18                 int x = points[i].x - points[j].x;
    19                 int y = points[i].y - points[j].y;
    20                 if (x == 0 && y == 0) {//重合点
    21                     overlap++;
    22                     continue;
    23                 }
    24                 int gcd = Gcd(x, y);
    25                 x = x / gcd;
    26                 y = y / gcd;
    27                 if (hashMap.containsKey(x)) {
    28                     hashMap.get(x).put(y, hashMap.get(x).getOrDefault(y, 0) + 1);
    29                 }else {
    30                     Map<Integer,Integer> map = new HashMap<Integer,Integer>();
    31                     map.put(y, 1);
    32                     hashMap.put(x, map);
    33                 }
    34                 maxCount = Math.max(maxCount, hashMap.get(x).get(y));
    35             }
    36             res = Math.max(res, maxCount + overlap + 1);
    37         }
    38         return res;
    39     }
    40     private int Gcd(int x, int y){
    41         if (y == 0) return x;
    42         return Gcd(y, x%y);
    43     }
    44 }
  • 相关阅读:
    联想电脑关闭屏幕点亮屏幕(T480为例)
    安卓手机时钟APP推荐
    电脑手机端如何互传文件、图片、网址等
    仿写一个简陋的 IOC/AOP 框架 mini-spring
    类加载之 <clinit>() 和 <init>()
    深入理解Java类加载
    Java垃圾回收
    Java内存区域(运行时数据区域)和内存模型(JMM)
    Java 泛型学习总结
    一篇文章概括 Java Date Time 的使用
  • 原文地址:https://www.cnblogs.com/Deribs4/p/6617340.html
Copyright © 2011-2022 走看看