国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Leetcode 149 - Max Points on a Line(Math)

2019-11-06 06:19:38
字體:
來源:轉載
供稿:網友

題意

一個2D平面內有若干個點,找一條直線使之穿過的點數最多,求最多穿過的點數。

思路

首先,我們先從一般情況考慮,假設我們當前直線已經穿過一個點(a,b)了,那么只需要枚舉剩下的點p(x,y),并且建立map[x - a / y - b]穿過點數的映射即可。

那么,我們這道題只需要枚舉直線穿過的點,然后再遍歷剩下的點求斜率并且統計就好。

在求斜率的時候,假設我們當前直線起點為(a,b),穿過兩個點:(x1,y1)(x2,y2)。那么斜率為y2?y1x2?x1。但是實際上會存在精度誤差,比如現在leetcode數據增強了直接求斜率就不能過了。所以我們要找一個替代的方案。

假設我們斜率k=xy,我們需要將double型的k轉換成一個無精度損失的表示方法,因為k=xy,我們只需要將分子分母約分成最簡表示k=x′y′,那么我們的k就可以轉化成了pair<int, int>(x', y')

所以,我們將分子分母同除最大公約數即可。

注意:

重復點斜率為無窮大的點。

代碼

/** * Definition for a point. * 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>& point) { map<pair<int, int>, int> slope; int ans = 0; for (int i = 0; i < point.size(); i++) { int dup = 1; slope.clear(); for (int j = i + 1; j < point.size(); j++) { if (point[i].x == point[j].x && point[i].y == point[j].y) {dup++; continue;} if (point[i].x == point[j].x) { slope[make_pair(0, 0)]++; } else { int ny = point[j].y - point[i].y; int nx = point[j].x - point[i].x; int g = __gcd(nx, ny); nx /= g, ny /= g; slope[make_pair(nx, ny)]++; } } ans = max(ans, dup); for (auto it = slope.begin(); it != slope.end(); it++) { ans = max(ans, it->second + dup); } } return ans; }};
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 万安县| 淮滨县| 乡宁县| 乌鲁木齐市| 临颍县| 惠安县| 漳浦县| 揭东县| 新巴尔虎左旗| 清镇市| 滦平县| 北流市| 连城县| 蒙城县| 阿鲁科尔沁旗| 祁东县| 莲花县| 漠河县| 顺平县| 西昌市| 盖州市| 漳州市| 南郑县| 巴塘县| 鸡东县| 开鲁县| 迭部县| 南陵县| 眉山市| 天峻县| 同德县| 松溪县| 新建县| 奉贤区| 安泽县| 禄丰县| 株洲县| 龙胜| 油尖旺区| 云龙县| 海丰县|