当前位置: 首页 > news >正文

LeetCode -- 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. 两层循环遍历节点O,存直线方程的关键因子:斜率:K, 截距:B,X:X轴截距(K为无穷时),Y:Y轴截距(K为0时)。
2. 对每个方程分别遍历每个点,找到满足最多点的方程即可。


注:在小于精度0.00001时,本解法有Bug


实现代码:





 /**
 * Definition for a point.
 * public class Point {
 *     public int x;
 *     public int y;
 *     public Point() { x = 0; y = 0; }
 *     public Point(int a, int b) { x = a; y = b; }
 * }
 */
public class Solution {
    public int MaxPoints(Point[] points) 
    {
     	if(points.Length == 0){
    		return 0;
    	}
    	if(points.Length < 2){
    		return 1;
    	}
     	
    	// 1. same line functions into list
    	var funcs = new Dictionary<string, LineFunc>();
    	
    	for(var i = 0;i < points.Length; i++){
    		for(var j = 0; j < points.Length;j ++){
    			if(i != j){
    				var line = Line(points[i], points[j]);
    				var k = line.ToString();
    				if(!funcs.ContainsKey(k)){
    					funcs.Add(k,line);
    				}
    			}
    		}
    	}


    	// 2. loop each function , count how many points can fulfil
    	var max = 0;
    	foreach(var k in funcs.Keys){
    		var c = 0;
    		for(var i = 0;i < points.Length; i++){
    			if(funcs[k].Test(points[i])){
    				c++;
    			}
    		}
    		if(c > max){
    			max = c;
    		}
    	}
    	
    	return max;
    }


private LineFunc Line(Point p1 , Point p2){
	double deltaX = p1.x - p2.x;
	var k = deltaX == 0 ? int.MaxValue : ((p1.y - p2.y) / deltaX);
	var b = p1.y - k * p1.x;
	
	return new LineFunc(k,b,p1.x,p1.y);
}


public class LineFunc{


	public LineFunc(double k , double b, double x0, double y0){
		K = k;
		if(k == 0){
			Y = y0;
		}
		else if(k == int.MaxValue){
			X = x0;
		}
		else{
			B = b;
		}
	}
	
	public bool Test(Point p){
		if(K == int.MaxValue){
			return p.x == X;
		}
		else if(K == 0){
			return p.y == Y;
		}
		else{
			var delta = p.y - (p.x * K + B);
			return delta < 0.00001 && delta > -0.000001;
		}
	}
	
	public double K;
	public double Y;
	public double X;
	public double B;
	
	public override string ToString(){
		return string.Format("{0}_{1}_{2}_{3}", K, B, X, Y);
	}
}




}


相关文章:

  • ArcGIS Server Java ADF 案例教程 17
  • LeetCode -- Maximal Square
  • ArcGIS Server Java ADF 案例教程 18
  • LeetCode -- Summary Ranges
  • ArcGIS Server Java ADF 案例教程 19
  • ArcGIS Server Java ADF 案例教程 20
  • LeetCode -- Unique Paths
  • 警惕手机流氓软件的流行
  • LeetCode -- Combination Sum II
  • 学习百度、腾讯如何把产品做到极致(转载)
  • LeetCode -- Edit Distance
  • Leetcode -- Find Minimum in Rotated Sorted Array
  • SQL2005CLR函数扩展-树的结构
  • LeetCode -- Longest Consecutive Sequence
  • Flex与.NET互操作(八):使用FluorineFx网关实现远程访问
  • 3.7、@ResponseBody 和 @RestController
  • gitlab-ci配置详解(一)
  • Java Agent 学习笔记
  • JAVA SE 6 GC调优笔记
  • JS实现简单的MVC模式开发小游戏
  • mysql innodb 索引使用指南
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • SpiderData 2019年2月13日 DApp数据排行榜
  • webgl (原生)基础入门指南【一】
  • Zepto.js源码学习之二
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 前端自动化解决方案
  • 如何用vue打造一个移动端音乐播放器
  • 三栏布局总结
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 以太坊客户端Geth命令参数详解
  • 智能合约开发环境搭建及Hello World合约
  • 追踪解析 FutureTask 源码
  • mysql面试题分组并合并列
  • 正则表达式-基础知识Review
  • #DBA杂记1
  • $forceUpdate()函数
  • (1)SpringCloud 整合Python
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (2022 CVPR) Unbiased Teacher v2
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (4) PIVOT 和 UPIVOT 的使用
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (ibm)Java 语言的 XPath API
  • (Java)【深基9.例1】选举学生会
  • (python)数据结构---字典
  • (笔试题)合法字符串
  • (编译到47%失败)to be deleted
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (数据结构)顺序表的定义
  • **CI中自动类加载的用法总结
  • .NET 发展历程