LeetCode 面试题 16.14. 最佳直线

一、题目

  给定一个二维平面及平面上的 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

  点击此处跳转题目

二、C# 题解

  暴力枚举,效果反而是最好的hh。注意以下几点:

  • 使用 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# 的用户
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蔗理苦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值