max-points-on-a-line

来源:互联网 发布:aviris数据下载 编辑:程序博客网 时间:2024/05/21 22:56

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.

  • 思路

    暴力解决,依次便利i,将其他点到i点的斜率依次保存,动态维护一个到该点斜率相同最多的个数,最后依次遍历找到最大点返回即可.

  • AC代码
import java.util.*;/** * 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 < 3) return points.length;          int max = 0;//用于返回的结果,即共线点的最大个数          Map<Double, Integer> map = new HashMap<Double, Integer>();//保存同一个斜率的点的个数          for (int i = 0; i < points.length; i++) {//以每一个点为固定点              map.clear();              int duplicate = 1;//记录跟固定点重合的个数              for(int j = 0 ; j < points.length; j++){//遍历其他点,求其与固定点之间的斜率                  if (i == j) continue;//如果是自己,跳过                  double slope = 0.0;//斜率                  if (points[i].x == points[j].x && points[i].y == points[j].y) {//如果跟固定点重合                      duplicate++;                      continue;                  } else if (points[i].x == points[j].x) {//如果跟固定点在同一条竖线上,斜率设为最大值                      slope = Integer.MAX_VALUE;                  } else {//计算该点与固定点的斜率                      slope = (double)(points[i].y - points[j].y) / (points[i].x - points[j].x);//注意如果将进行double转换,如果不添加double。像5/2位2.0,加上double后先将5转为5.0得到为2.5                }                  map.put(slope, map.containsKey(slope) ? map.get(slope) + 1 : 1);              }              //更新最优解              if (map.keySet().size() == 0) {//如果map为空                 return duplicate;            } else {                  for (double key : map.keySet()) {                      max = Math.max((duplicate + map.get(key)), max);                   }              }          }          return max;      } }
0 0
原创粉丝点击