• 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. 定义Line类

    {slope; intercept; isVertical; isHorizontal}

    定义hashcode(), equals()方法

    2. 遍历每两两的点,记录下数目最多的Line;

    3. 遍历所有的点,记录下在该Line上的点的数目,即为共线的最大数目;

    注意:点集中有可能有重合的点。

    程序

    class Line {
    	static double epsilo = 0.00001;
    	double slope;
    	double intercept;
    	boolean isVertical;
    	boolean isHorizontal;
    
    	public Line(double x1, double y1, double x2, double y2) {
    		if (isEquals(x1, x2)) {
    			isVertical = true;
    			intercept = x1;
    		} else if (isEquals(y1, y2)) {
    			isHorizontal = true;
    			intercept = y1;
    		} else {
    			slope = (y1 - y2) / (x1 - x2);
    			intercept = x1 - y1 / slope;
    		}
    	}
    
    	public static boolean isEquals(double d1, double d2) {
    		return Math.abs(d1 - d2) < epsilo;
    	}
    
    	@Override
    	public boolean equals(Object obj) {
    		if (!(obj instanceof Line)) {
    			return false;
    		}
    		Line line = (Line) obj;
    		if (isEquals(line.slope, this.slope)
    				&& isEquals(line.intercept, this.intercept)
    				&& line.isVertical == this.isVertical
    				&& line.isHorizontal == this.isHorizontal) {
    			return true;
    		}
    		return false;
    	}
    
    	@Override
    	public int hashCode() {
    		return (int) (slope * 1000) | (int) (intercept * 1000);
    	}
    }
    
    public class Solution {
        public int maxPoints(Point[] points) {
    		if (points == null) {
    			return 0;
    		}
    		if (points.length <= 2) {
    			return points.length;
    		}
    
    		HashMap<Line, Integer> map = new HashMap<Line, Integer>();
    		for (int i = 0; i < points.length - 1; i++) {
    			for (int j = i + 1; j < points.length; j++) {
    				Point p1 = points[i];
    				Point p2 = points[j];
    				Line line = new Line(p1.x, p1.y, p2.x, p2.y);
    				if (map.containsKey(line)) {
    					map.put(line, map.get(line) + 1);
    				} else {
    					map.put(line, 1);
    				}
    			}
    		}
    
    		int max = 0;
    		Line maxLine = null;
    		for (Line l : map.keySet()) {
    			if (map.get(l) > max) {
    				max = map.get(l);
    				maxLine = l;
    			}
    		}
    
    		if (maxLine == null) {
    			return -1;
    		}
    
    		int cnt = 0;
    		if (maxLine.isVertical) {
    			for (Point point : points) {
    				if (Line.isEquals(point.x, maxLine.intercept)) {
    					++cnt;
    				}
    			}
    		} else if (maxLine.isHorizontal) {
    			for (Point point : points) {
    				if (Line.isEquals(point.y, maxLine.intercept)) {
    					++cnt;
    				}
    			}
    		} else {
    			for (Point point : points) {
    				if (Line.isEquals(point.y, maxLine.slope
    						* (point.x - maxLine.intercept))) {
    					++cnt;
    				}
    			}
    		}
    		return cnt;
    	}
    }
    
  • 相关阅读:
    Android Animations动画使用详解
    android LinearLayout和RelativeLayout实现精确布局
    中国天气网API
    获取中央气象台API 完整城市列表简单方式
    Django框架 连接Oracle -ServerName方式报错
    关于java的动态代理
    Mybatis缓存
    Git使用,将本地项目推送到GitHub上
    使用doxc4j将word转pdf遇到的一个问题
    linux安装jdk
  • 原文地址:https://www.cnblogs.com/harrygogo/p/4722316.html
Copyright © 2020-2023  润新知