Leetcode--149. 直线上最多的点数
給定一個二維平面,平面上有?n?個點,求最多有多少個點在同一條直線上。
示例 1:
輸入: [[1,1],[2,2],[3,3]]
輸出: 3
解釋:
^
|
| ???????o
| ????o
| ?o ?
+------------->
0 ?1 ?2 ?3 ?4
示例?2:
輸入: [[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]]
輸出: 4
解釋:
^
|
| ?o
| ????o??? ? ? o
| ????? ?o
| ?o ?? ? ? o
+------------------->
0 ?1 ?2 ?3 ?4 ?5 ?6
提交的代碼:
class?Solution?{
????public?int?maxPoints(int[][]?points)?{
????if?(points.length?<?3)?{
????????return?points.length;
????}
????int?res?=?0;
????//遍歷每個點
????for?(int?i?=?0;?i?<?points.length;?i++)?{
????????int?duplicate?=?0;
????????int?max?=?0;//保存經過當前點的直線中,最多的點
????????HashMap<String,?Integer>?map?=?new?HashMap<>();
????????for?(int?j?=?i?+?1;?j?<?points.length;?j++)?{
????????????//求出分子分母
????????????int?x?=?points[j][0]?-?points[i][0];
????????????int?y?=?points[j][1]?-?points[i][1];
????????????if?(x?==?0?&&?y?==?0)?{
????????????????duplicate++;
????????????????continue;
?
????????????}
????????????//進行約分
????????????int?gcd?=?gcd(x,?y);
????????????x?=?x?/?gcd;
????????????y?=?y?/?gcd;
????????????String?key?=?x?+?"@"?+?y;
????????????map.put(key,?map.getOrDefault(key,?0)?+?1);
????????????max?=?Math.max(max,?map.get(key));
????????}
????????//1?代表當前考慮的點,duplicate?代表和當前的點重復的點
????????res?=?Math.max(res,?max?+?duplicate?+?1);
????}
????return?res;
}
?
private?int?gcd(int?a,?int?b)?{
????while?(b?!=?0)?{
????????int?temp?=?a?%?b;
????????a?=?b;
????????b?=?temp;
????}
????return?a;
}
}
總結
以上是生活随笔為你收集整理的Leetcode--149. 直线上最多的点数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux进程通信的四种方式——共享内存
- 下一篇: AcWing--2.01背包问题