Leetcode-149-Max Ponits on a Line C#
2015-11-12 15:30
429 查看
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
题意:找到在同一直线上的点的最大个数。
分析:首先看这个题的暴力方法,两点确定一条直线,所以确定下一条直线后,挨个验证剩下的点是不是也在这条直线上,并记录个数,O(n^3)的时间复杂度就可以解决问题,这个量级的时间复杂度很明显是不符合要求的,如何降低时间复杂度呢?
问题的关键就在于如何描述一条直线,和共线这两个问题,而要解决这两个问题的方法很简单,借助一条初中几何的直线性质即可,那就是过同一个点的斜率相同的直线是同一条直线,所以只要固定一个点X,然后计算剩下的点和X的连线斜率,只要是相同的就是共线的,然后借助哈希表就可以记录下不同斜率的出现次数。
在算法实现的时候,要注意除0异常,两点重合的情况,除0异常很简单,判断两个点的横坐标是否相同,如果相同的话则以最大斜率表示。两点重合的情况要设置一个计数器来记录跟固定点重合的点的次数。
代码实现:
public class Solution
{
public int MaxPoints(Point[] points)
{
if (points.Length <= 2)
return points.Length;
Dictionary<float, int> slopes = new Dictionary<float, int>();
int res = 2;
for (int i = 0; i < points.Length; i++)
{
slopes.Clear();
int duplicate = 1;
for (int j = i+1; j < points.Length; j++)
{
if (points[i].x == points[j].x && points[i].y == points[j].y)
duplicate++;
else
{
float slope = points[i].x==points[j].x? (float)Math.Pow(2,31)-1: (float)(points[i].y - points[j].y) / (float)(points[i].x - points[j].x);
if (slopes.ContainsKey(slope))
slopes[slope]++;
else
slopes.Add(slope, 1);
}
}
res = Math.Max(res,duplicate);
foreach (KeyValuePair<float, int> tmp in slopes)
{
res = res > tmp.Value + duplicate ? res : tmp.Value + duplicate;
}
}
return res;
}
}
题意:找到在同一直线上的点的最大个数。
分析:首先看这个题的暴力方法,两点确定一条直线,所以确定下一条直线后,挨个验证剩下的点是不是也在这条直线上,并记录个数,O(n^3)的时间复杂度就可以解决问题,这个量级的时间复杂度很明显是不符合要求的,如何降低时间复杂度呢?
问题的关键就在于如何描述一条直线,和共线这两个问题,而要解决这两个问题的方法很简单,借助一条初中几何的直线性质即可,那就是过同一个点的斜率相同的直线是同一条直线,所以只要固定一个点X,然后计算剩下的点和X的连线斜率,只要是相同的就是共线的,然后借助哈希表就可以记录下不同斜率的出现次数。
在算法实现的时候,要注意除0异常,两点重合的情况,除0异常很简单,判断两个点的横坐标是否相同,如果相同的话则以最大斜率表示。两点重合的情况要设置一个计数器来记录跟固定点重合的点的次数。
代码实现:
public class Solution
{
public int MaxPoints(Point[] points)
{
if (points.Length <= 2)
return points.Length;
Dictionary<float, int> slopes = new Dictionary<float, int>();
int res = 2;
for (int i = 0; i < points.Length; i++)
{
slopes.Clear();
int duplicate = 1;
for (int j = i+1; j < points.Length; j++)
{
if (points[i].x == points[j].x && points[i].y == points[j].y)
duplicate++;
else
{
float slope = points[i].x==points[j].x? (float)Math.Pow(2,31)-1: (float)(points[i].y - points[j].y) / (float)(points[i].x - points[j].x);
if (slopes.ContainsKey(slope))
slopes[slope]++;
else
slopes.Add(slope, 1);
}
}
res = Math.Max(res,duplicate);
foreach (KeyValuePair<float, int> tmp in slopes)
{
res = res > tmp.Value + duplicate ? res : tmp.Value + duplicate;
}
}
return res;
}
}
相关文章推荐
- c#调用COM组件
- 动易2006序列号破解算法公布
- C#实现把指定数据写入串口
- C#动态创建button的方法
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- C#使用加边法计算行列式的值
- C#实现多线程的同步方法实例分析
- C#中尾递归的使用、优化及编译器优化
- C#实现子窗体与父窗体通信方法实例总结
- C#通用邮件发送类分享
- C#中this的用法集锦
- C#.NET获取拨号连接的宽带连接方法
- C#异步绑定数据实现方法
- C#实现AddRange为数组添加多个元素的方法
- C#中Equality和Identity浅析
- C#生成饼形图及添加文字说明实例代码
- C#判等对象是否相等的方法汇总
- C#简单的向量用法实例教程
- C#实现基于链表的内存记事本实例