leetcode 149. Max Points on a Line 计算斜率的问题
来源:互联网 发布:股票交易算法 编辑:程序博客网 时间:2024/06/11 02:44
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
本题就是统计在一条线上的最多的点的数量。
解决方法就是遍历求解,但是主语Java的浮点数的计算精度的问题。
代码如下:
import java.math.BigDecimal;import java.util.HashMap;/*class Point { int x; int y; Point() { x = 0; y = 0; } Point(int a, int b) { x = a; y = b; }}*//* * 注意Java的浮点数精度 * */public class Solution{ public int maxPoints(Point[] points) { if (points.length <= 2) return points.length; int max = 2; for (int i = 0; i < points.length; i++) { int pointMax = 1, samePointCount = 0; HashMap<Double, Integer> slopeCount = new HashMap<Double, Integer>(); for (int j = i + 1; j < points.length; j++) { if (points[i].x == points[j].x && points[i].y == points[j].y) { samePointCount++; continue; } double k; if (points[i].x == points[j].x) k = Float.POSITIVE_INFINITY; //这里是为了避免出现-0.0和0.0的问题 else if (points[i].y == points[j].y) k = 0.0; else { //这里是为了避免出现(k,k+1),(k+1,k+2)和(0,0)的斜率精度问题 //这里是考虑到了Java的Double的精度问题,所以才是用BigDecimal的问题 BigDecimal fenziBigDecimal=new BigDecimal(points[i].x-points[j].x); BigDecimal fenmuBigDecimal=new BigDecimal(points[i].y-points[j].y); k = fenziBigDecimal.divide(fenmuBigDecimal,20,BigDecimal.ROUND_HALF_DOWN).doubleValue(); } slopeCount.put(k, slopeCount.getOrDefault(k, 1)+1); pointMax = Math.max(pointMax, slopeCount.get(k)); } max = Math.max(max, pointMax+samePointCount); } return max; }}
下面是C++的做法,就是遍历所有的可能性,注意可能出现极端情况,所以这里使用了long double 来计算极端情况的斜率值
代码如下:
#include <iostream>#include <climits>#include <map>#include <vector>#include <algorithm>using namespace std;/*struct Point { int x; int y; Point() : x(0), y(0) {} Point(int a, int b) : x(a), y(b) {}};*/class Solution{public: int maxPoints(vector<Point>& points) { if (points.size() <= 2) return points.size(); int maxRes = 2; for (int i = 0; i < points.size(); i++) { int pointMax = 1, samePoint = 0; map<long double, int> count; for (int j = i + 1; j < points.size(); j++) { if (points[i].x == points[j].x && points[i].y == points[j].y) { samePoint++; continue; } long double k = 0; if (points[i].x == points[j].x) k = numeric_limits<double>::max(); else k = ((long double)points[i].y - (long double)points[j].y) / ((long double)points[i].x - (long double)points[j].x); if (count.find(k) == count.end()) count[k] = 2; else count[k] += 1; pointMax = max(pointMax,count[k]); } maxRes = max(maxRes, pointMax+samePoint); } return maxRes; }};
阅读全文
0 0
- leetcode 149. Max Points on a Line 计算斜率的问题
- LeetCode 149. Max Points on a Line
- [leetcode] 149. Max Points on a Line
- leetcode 149. Max Points on a Line
- Leetcode 149. Max Points on a Line
- LeetCode 149. Max Points on a Line
- leetcode.149. Max Points on a Line
- LeetCode-149.Max Points on a Line
- leetcode 149. Max Points on a Line
- leetCode 149. Max Points on a Line
- [LeetCode] 149. Max Points on a Line
- LeetCode 149. Max Points on a Line
- [LeetCode]149. Max Points on a Line
- [LeetCode]149. Max Points on a Line
- [LeetCode]149. Max Points on a Line
- Leetcode 149. Max Points on a Line
- [LeetCode] 149. Max Points on a Line
- Leetcode 149. Max Points on a Line
- linux 3.6 启动源码分析(五) kernel_init进程
- nodejs -- 链接mongodb
- 前端常用JS库
- ASIC/SoC设计
- 北大 AI 公开课第10讲 胡郁:人工智能+,共创新时代
- leetcode 149. Max Points on a Line 计算斜率的问题
- 【剑指offer】面试题25:从上往下打印二叉树
- Log4j的使用
- http协议详解
- 等待事件整体印象
- C++内存检测
- windows10配置jdk和Tomcat
- PAT考试已结束,撒花
- 【Python3.6】将个人微信改造成机器人自动对话