一、题目
给定一个二维平面及平面上的 N 个点列表 Points
,其中第 i
个点的坐标为 Points[i]=[Xi,Yi]
。请找出一条直线,其通过的点的数目最多。
设穿过最多点的直线所穿过的全部点编号从小到大排序的列表为 S
,你仅需返回 [S[0],S[1]]
作为答案,若有多条直线穿过了相同数量的点,则选择 S[0]
值较小的直线返回,S[0]
相同则选择 S[1]
值较小的直线返回。
示例:
输入: [[0,0],[1,1],[1,0],[2,0]]
输出: [0,2]
解释: 所求直线穿过的3个点的编号为[0,2,3]
提示:
2 <= len(Points) <= 300
len(Points[i]) = 2
点击此处跳转题目。文章来源:https://www.toymoban.com/news/detail-739965.html
二、C# 题解
暴力枚举,效果反而是最好的hh。注意以下几点:文章来源地址https://www.toymoban.com/news/detail-739965.html
- 使用
x1 * y2 == x2 * y1
判断斜率是否相同。 - 少封装方法,以免传参影响计算效率。
public class Solution {
public int[] BestLine(int[][] points) {
int max = 0;
int[] ans = { 0, 1 };
for (var i = 0; i < points.Length; i++) {
for (var j = i + 1; j < points.Length; j++) {
int tmp = 0;
int x1 = points[i][0] - points[j][0], y1 = points[i][1] - points[j][1];
for (int k = j + 1; k < points.Length; k++) {
int x2 = points[k][0] - points[j][0], y2 = points[k][1] - points[j][1];
if (x1 * y2 == x2 * y1) tmp++;
}
if (tmp <= max) continue;
max = tmp;
ans[0] = i;
ans[1] = j;
}
}
return ans;
}
}
- 时间:152 ms,击败 100.00% 使用 C# 的用户
- 内存:41.23 MB,击败 100.00% 使用 C# 的用户
到了这里,关于LeetCode 面试题 16.14. 最佳直线的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!