1.问题描述

  

Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.

  

2.翻译

  

对于在一个平面上的N个点,找出在同一条直线的最多的点的数目

  

3.思路分析

  我们知道任意的两个点可以构成一条直线,对于一条在直线的上的点,他们必然具有相同的斜率,这个我初中都知道了。因为找出最多的点的方法也就比较简单了,我们只要依次遍历这些点,并且记录相同的斜率的点的数目,这样数目最大的那个斜率对应的值就是我们所需要的那个最大值了,因为我们需要一个HashMap,key用来存放斜率,value用来记录点的数目,最后我们只需要拿出value最大的那个 值就可以了。因为HashMap的底层采用hash实现,所以在查找比对的过程中效率还是比较高的。

4.实现代码

  Solution.java()(实现过程借鉴了别人的实现,但是解题的思路是自己的)

    

package maxPoints;

import java.util.HashMap;

public class Solution {

    public  int maxPoints(Point[] points) {

        if(points.length <= 2) {//如果点的数目小于等于2,那么一直线上的点就是数组的长度了
return points.length;
} double k = 0.0;//斜率
int maxPointNum = 0;
int tempMaxPointNum = 0;
int samePointNum = 0;//坐标完全相同点的个数
int parallelPointNum = 0; //与x轴平行
HashMap<Double,Integer> slopeMap = new HashMap<Double,Integer>(); for(int i=0;i<points.length-1;i++) { samePointNum = 1; //代表起始点,会被累加上
parallelPointNum = 0;
tempMaxPointNum = 0;
slopeMap.clear(); for(int j=i+1;j<points.length;j++) { if((points[i].x == points[j].x)&&((points[i].y == points[j].y))) {//坐标完全相同
samePointNum++;
continue;
} if(points[i].x == points[j].x) { //与y轴平行 parallelPointNum++; } else { if(points[i].y == points[j].y) {
k = 0;
} else {
k = ((double)(points[i].y - points[j].y))/(points[i].x - points[j].x);
} if(slopeMap.get(k) == null) {//斜率不存在
slopeMap.put(k, new Integer(1)); if(1>tempMaxPointNum) {
tempMaxPointNum = 1;
}
}else {//斜率已存在 int number = slopeMap.get(k);
number++;
slopeMap.put(k, new Integer(number));
if(number>tempMaxPointNum) {
tempMaxPointNum = number;
}
}
}
} if(parallelPointNum > 1) {
if(parallelPointNum>tempMaxPointNum) {
tempMaxPointNum = parallelPointNum;
}
} tempMaxPointNum += samePointNum;//加上起始点和具有相同坐标的点 if(tempMaxPointNum>maxPointNum) {
maxPointNum = tempMaxPointNum;
}
} return maxPointNum;
} }

  

  SoultionTest.java

  

package maxPoints;

import java.util.Random;

public class SolutionTest {

	/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Point []pointArr = new Point[100];
for(int index = 0;index < 100;index++){
Point point = new Point(index,new Random(index).nextInt());
pointArr[index] = point;
System.out.println("Point("+point.x+","+point.y+")");
}
System.out.println(new Solution().maxPoints(pointArr));
} }

  结果:

Point(0,-1155484576)
Point(1,-1155869325)
Point(2,-1154715079)
Point(3,-1155099828)
Point(4,-1157023572)
Point(5,-1157408321)
Point(6,-1156254074)
Point(7,-1156638823)
Point(8,-1158562568)
Point(9,-1158947317)
Point(10,-1157793070)
Point(11,-1158177819)
Point(12,-1160101563)
Point(13,-1160486312)
Point(14,-1159332065)
Point(15,-1159716814)
Point(16,-1149328594)
Point(17,-1149713343)
Point(18,-1148559096)
Point(19,-1148943845)
Point(20,-1150867590)
Point(21,-1151252339)
Point(22,-1150098092)
Point(23,-1150482841)
Point(24,-1152406585)
Point(25,-1152791334)
Point(26,-1151637087)
Point(27,-1152021836)
Point(28,-1153945581)
Point(29,-1154330330)
Point(30,-1153176083)
Point(31,-1153560832)
Point(32,-1167796541)
Point(33,-1168181290)
Point(34,-1167027043)
Point(35,-1167411792)
Point(36,-1169335537)
Point(37,-1169720286)
Point(38,-1168566039)
Point(39,-1168950788)
Point(40,-1170874532)
Point(41,-1171259281)
Point(42,-1170105035)
Point(43,-1170489784)
Point(44,-1172413528)
Point(45,-1172798277)
Point(46,-1171644030)
Point(47,-1172028779)
Point(48,-1161640559)
Point(49,-1162025308)
Point(50,-1160871061)
Point(51,-1161255810)
Point(52,-1163179554)
Point(53,-1163564303)
Point(54,-1162410057)
Point(55,-1162794806)
Point(56,-1164718550)
Point(57,-1165103299)
Point(58,-1163949052)
Point(59,-1164333801)
Point(60,-1166257546)
Point(61,-1166642295)
Point(62,-1165488048)
Point(63,-1165872797)
Point(64,-1180108506)
Point(65,-1180493255)
Point(66,-1179339008)
Point(67,-1179723757)
Point(68,-1181647502)
Point(69,-1182032251)
Point(70,-1180878004)
Point(71,-1181262753)
Point(72,-1183186497)
Point(73,-1183571246)
Point(74,-1182416999)
Point(75,-1182801748)
Point(76,-1184725493)
Point(77,-1185110242)
Point(78,-1183955995)
Point(79,-1184340744)
Point(80,-1173952524)
Point(81,-1174337273)
Point(82,-1173183026)
Point(83,-1173567775)
Point(84,-1175491519)
Point(85,-1175876268)
Point(86,-1174722021)
Point(87,-1175106770)
Point(88,-1177030515)
Point(89,-1177415264)
Point(90,-1176261017)
Point(91,-1176645766)
Point(92,-1178569510)
Point(93,-1178954259)
Point(94,-1177800013)
Point(95,-1178184762)
Point(96,-1192420471)
Point(97,-1192805220)
Point(98,-1191650973)
Point(99,-1192035722)
6

  从结果输出了可以看出在通一条直线上最多的点是6个。

5.这个题的解决方法很暴力,可是还有很多细节需要注意,比如斜率为0 的情况,斜率不存在的情况,还有点重合的情况,等等。

LeetCode之Max Points on a Line Total的更多相关文章

  1. 【leetcode】Max Points on a Line

    Max Points on a Line 题目描述: Given n points on a 2D plane, find the maximum number of points that lie ...

  2. [LeetCode OJ] Max Points on a Line

    Max Points on a Line Submission Details 27 / 27 test cases passed. Status: Accepted Runtime: 472 ms ...

  3. [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. ...

  4. [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. ...

  5. 【leetcode】Max Points on a Line(hard)☆

    Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. ...

  6. Java for 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. ...

  7. leetcode 149. Max Points on a Line --------- java

    Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. ...

  8. [LeetCode OJ] 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.

    //定义二维平面上的点struct Point { int x; int y; Point(, ):x(a),y(b){} }; bool operator==(const Point& le ...

  9. 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. ...

随机推荐

  1. Meld Diff for windows 安装和配置

    Meld Diff for windows 安装和配置 假设你在ubuntu 正在开发中, meld diff 此工具你肯定不会感到陌生. 而且很容易使用. 在网上看 meld for Windows ...

  2. STL源代码分析——STL算法merge合并算法

    前言 因为在前文的<STL算法剖析>中.源代码剖析许多.不方便学习.也不方便以后复习,这里把这些算法进行归类.对他们单独的源代码剖析进行解说.本文介绍的STL算法中的merge合并算法. ...

  3. Ubuntu文件的复制、移动和删除命令

    先说说cp复制命令 该命令的功能是将给出的文件或文件夹复制到还有一文件或文件夹中,同MSDOS下的copy命令一样,功能十分强大. 语法: cp [选项] 源文件或文件夹 目标文件或文件夹 说明:该命 ...

  4. [SignalR]初步认识以及安装

    原文:[SignalR]初步认识以及安装 1.什么是ASP.NET SignalR? ASP .NET SignalR是一个 ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时 ...

  5. Ad Hoc

    Ad Hoc源自于拉丁语,意思是"for this"引申为"for this purpose only",即"为某种目的设置的,特别的"意思 ...

  6. LeetCodeOJ. Maximum Depth of Binary Tree

    见问题: https://oj.leetcode.com/problems/maximum-depth-of-binary-tree/ 主题概述 Given a binary tree, find i ...

  7. 一些有用的javascript实例分析(一)

    原文:一些有用的javascript实例分析(一) 本文以http://fgm.cc/learn/链接的实例索引为基础,可参见其实际效果.分析和整理了一些有用的javascript实例,相信对一些初学 ...

  8. HDU 4932 Miaomiao&#39;s Geometry(推理)

    HDU 4932 Miaomiao's Geometry pid=4932" target="_blank" style="">题目链接 题意: ...

  9. Tomcat剖析(四):Tomcat默认连接器(1)

    Tomcat剖析(四):Tomcat默认连接器(1) 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三): ...

  10. 【Stackoverflow好问题】java在,如何推断阵列Array是否包括指定的值

    问题 java中,怎样推断数组Array是否包括指定的值 精华回答 1. Arrays.asList(...).contains(...) 2. 使用 Apache Commons Lang包中的Ar ...