Leetcode:149. 直线上最多的点数

Leetcode: 149. 直线上最多的点数

题目描述

给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上。

示例 1:

输入: [[1,1],[2,2],[3,3]]
输出: 3
解释:
^
|
|        o
|     o
|  o  
+------------->
0  1  2  3  4

示例 2:

输入: [[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]]
输出: 4
解释:
^
|
|  o
|     o        o
|        o
|  o        o
+------------------->
0  1  2  3  4  5  6

思路

思路1: 点斜法记录直线+hashMap

使用点斜法记录i与i+1开始的斜率值,保存最大值,并记录重复值,最后比较结果

代码

代码1

class Solution {
    public int maxPoints(int[][] points) {
        if (points.length < 3){
            return points.length;
        }
        int duplicatedNum = 0;
        int num = points.length;
        int result = 0;
        for(int i = 0;i < num - 1; i++){
            if (points[i][0] != points[i + 1][0] || points[i][1] != points[i+1][1]){
                break;
            }
            duplicatedNum += 1;
        }
        if (duplicatedNum - 1 == num){
            return num;
        }
        
        for(int i = 0; i < num - 1; i++){
            duplicatedNum = 0;
            Map tempMap = new HashMap<>();
            int tempMax = 0;
            for(int j = i + 1; j < num; j++){
                int x = points[i][0] - points[j][0];
                int y = points[i][1] - points[j][1];
                int tempGcb = gcb(x, y);
                if (x == 0 && y == 0){
                    duplicatedNum += 1;
                    continue;
                }
                x = x / tempGcb;
                y = y / tempGcb;
                String tempKey = x + "#" + y;
                if (!tempMap.containsKey(tempKey)){
                    tempMap.put(tempKey, 0);
                }
                tempMap.put(tempKey, tempMap.get(tempKey) + 1);
                if (tempMap.get(tempKey) > tempMax){
                    tempMax = tempMap.get(tempKey);
                }
                
            }
            if (tempMax + duplicatedNum + 1 > result){
                result = tempMax + duplicatedNum + 1;
            }
        }
        return result;
        
    }
    
    private int gcb(int a, int b){
        while(b != 0){
            int temp = a % b;
            a = b;
            b = temp;
        }
        return a;
    }
}

复杂度分析

思路1时间复杂度

$O(n^2)$

思路1空间复杂度

$O(n^2)$


文章作者: 小风雷
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小风雷 !
评论
 上一篇
Leetcode:172. 阶乘后的零 Leetcode:172. 阶乘后的零
Leetcode:172. 阶乘后的零题目描述给定一个整数 n,返回 n! 结果尾数中零的数量。 示例 1:输入: 3 输出: 0 解释: 3! = 6, 尾数中没有零。 示例 2:输入: 5 输出: 1 解释: 5! = 120, 尾
2020-05-03
下一篇 
Leetcode:191. 位1的个数 Leetcode:191. 位1的个数
Leetcode:191. 位1的个数题目描述编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。 示例 1:输入:00000000000000000000000000001011 输出:
2020-05-01
  目录