Fantasy-JXF
  • Introduction
  • 机器学习
    • 机器学习基础
    • 机器学习实践
    • 机器学习算法
    • 集成学习
  • 深度学习
    • 深度学习基础
    • 深度学习实践
    • CNN
    • RNN
    • 优化算法
    • 序列建模
    • 《深度学习》整理
    • 术语表
  • 自然语言处理
    • NLP发展趋势
    • 自然语言处理基础
    • 句嵌入
    • 词向量
    • 多模态
    • 视觉问答(VQA)综述
    • 深度查询理解
      • 综述
  • 计算机视觉
    • 基本模型
  • 数学
    • 概率论
    • 微积分的本质
    • 深度学习的核心
  • 算法
    • 字符串
    • 数据结构
    • 数据结构Advanced
    • 双指针
    • 动态规划
    • 区间问题
    • 排列组合
    • 数学问题
    • 洗牌/采样/随机数
    • 大数运算
    • 海量数据处理
    • IO模板
    • 必备算法
    • LeetCode
    • 剑指Offer
    • 面试真题
  • 编程
    • C++基础
    • C++面向对象
    • C++左值与右值
    • Python基础
  • 笔试面经
    • 360
    • iHandy
    • 作业帮
    • 字节跳动
    • 小米
    • 度小满
    • 快手
    • 招行
    • 搜狐畅游
    • 滴滴
    • 爱奇艺
    • 百度
    • 百度2
    • 百度3
    • 百词斩
    • 腾讯
    • 迅雷
    • 顺丰
    • 旷视
    • 爱笔
    • 魔门塔
    • 搜狐
由 GitBook 提供支持
在本页
  • Index
  • 直线上最多的点数

这有帮助吗?

  1. 算法

数学问题

上一页排列组合下一页洗牌/采样/随机数

最后更新于6年前

这有帮助吗?

Index

直线上最多的点数

LeetCode -

问题描述

思路

  • 根据 y=kx+b,计算每两个点的 (k, b) 对,配合 map 存储

  • 使用 (k,b) 可能存在精度问题,更好的方法是使用 ax+by+c=0

  • 两者本质上没有区别,实际上就是把 k 分为 a/b 存储

  • 注意:将 {a, b} 作为 key 时应该先利用最大公约数缩小 a 和 b

C++

class Solution {
    int gcd(int a, int b) {
        return b == 0 ? a : gcd(b, a%b);
    }
public:
    int maxPoints(vector<Point>& P) {
        int n = P.size();
        if (n <= 2) return n;

        int ret = 0;
        for (int i = 0; i < n; i++) {
            map<pair<int, int>, int> line;
            int tmp = 0;                  // 保存与 P[i] 共线的点
            int dup = 0;                  // 记录重复点
            int col = 0;                  // 跟 P[i] 垂直的点

            for (int j = i + 1; j < n; j++) {
                if (P[i].x == P[j].x && P[i].y == P[j].y) {
                    dup += 1;
                }
                else if (P[i].x == P[j].x) {
                    col += 1;
                    tmp = max(tmp, col);
                }
                else {
                    int a = P[i].y - P[j].y;
                    int b = P[i].x - P[j].x;

                    int t = gcd(a, b);      // 利用最大公约数缩小
                    a /= t;
                    b /= t;
                    line[{a, b}]++;
                    tmp = max(tmp, line[{a, b}]);
                 }
            }
            ret = max(ret, tmp + dup + 1);
        }

        return ret;
    }
};
直线上最多的点数
149. 直线上最多的点数