【题目描述】:Given n points on a 2D plane, find the maximum number of points that lie on the same straight line
在一个二维平面上有n个点,求出现在同一直线上的点的最大个数
在此之间,我还去学了一下HashMap
是Map接口的常用实类
创建一个HashMap:
HashMap<键的数据类型(如Integer,Double,String…),值的数据类型(如Integer,Double,String…)
Map更新方法:clear()、put()、remove()
返回Map的方法:
entrySet():返回Map中所包含映射的set视图,set中的每个每个元素都是Map.Entry对象
keySet():返回Map中所包含【键】的视图、删除set中的元素还将删除Map中相应映射
values():返回Map中包含值的【collection】的视图
package leetcode;
import java.awt.Point;
import java.util.*;
public class Point_line {
public int maxPoints(Point[] point){
if(point.length<3){
return point.length;
}
int count=0;
HashMaphm = new HashMap();
for(int i=0;iint same=1;
Point cur=point[i];
for(int j=1;jdouble slope=0.0;
Point next=point[j];
if(cur.x==next.x&&cur.y==next.y){
same++;
continue;
}else if(cur.x==next.x){
slope=Integer.MAX_VALUE;
}
else{
slope=1.0*((cur.y-next.y)/(cur.x-next.x));
}
hm.put(slope,hm.containsKey(slope)?hm.get(slope)+1:1);
}
}
if(hm.keySet().size()==0){
count=same>count?same:count;
}else{
for(double key:hm.keySet()){
count= Math.max(same+hm.get(slope),count);
}
}
}
return count;
}
public static void main(String[] args){
}
}
写完之后。。。报错了
不通过 您的代码已保存 答案错误:您提交的程序没有通过所有的测试用例 case通过率为19.23%
测试用例: [(0,0),(1,1),(1,-1)]
对应输出应该为:
2
你的输出为:
3
为什么呢?代码哪里会有错呢?
后来发现自己写的双循环判断条件不对
而且为什么结果会是3?
for(double key:hm.keySet()){
System.out.println(i+"\t"+j+"\t"+hm.get(key)+"\t"+same);
public static void main(String[] args){
Point_line p=new Point_line();
Point[] point=null;
point=new Point[]
{
new Point(0,0),new Point(1,1),new Point(1,-1)
};
System.out.println(p.maxPoints(point));
}
得出的结果:
i j 点数 重合点数
0 1 1 1
0 2 1 1
0 2 1 1
1 2 1 2
2 1 1 1
3
point[i] |
point[j] |
same |
备注 |
(0,0) |
(1,1) |
1 |
|
(0,0) |
(1,-1) |
1 |
|
(0,0) |
(1,-1) |
1 |
为什么这里会有打印两次,因为此时的hm.keySet().size()=2,所以打印了两遍 |
(1,1) |
(1,1) |
1+1=2 |
因为j从1开始,又points[1]和points[j]重合,所以continue跳出循环,就是因为重合,所以same++,导致出了错 |
(1,1) |
(1,-1) |
1 |
|
(1,-1) |
(1,1) |
1 |
|
所以!!!之前的循环判断是错的!
for(int i=0;ilength;i++){
for(int j=1;points.length;j++){
}
}
正确循环判断
for(int i=0;ilength;i++){
for(int j=0;points.length;j++){
if(i==j)continue;
}
}
正解
import java.awt.Point;
import java.util.*;
public class Solution {
public int maxPoints(Point[] point){
if(point.length<3){
return point.length;
}
int count=0;
HashMaphm = new HashMap();
for(int i=0;iint same=1;
Point cur=point[i];
for(int j=0;jif(i==j)continue;
double slope=0.0;
Point next=point[j];
if(cur.x==next.x&&cur.y==next.y){
same++;
continue;
}else if(cur.x==next.x){
slope=Integer.MAX_VALUE;
}
else{
slope=1.0*((cur.y-next.y)/(cur.x-next.x));
}
hm.put(slope,hm.containsKey(slope)?hm.get(slope)+1:1);
}
if(hm.keySet().size()==0){
count=same>count?same:count;
}else{
for(double key:hm.keySet()){
count= Math.max(same+hm.get(key),count);
}
}
}
return count;
}
public static void main(String[] args){
Point_line p=new Point_line();
Point[] point=null;
point=new Point[]
{
new Point(0,0),new Point(1,1),new Point(1,-1)
};
System.out.println(p.maxPoints(point));
}
}