zoukankan      html  css  js  c++  java
  • 【Leetcode】Max Points on a Line

    Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.

    每次固定一个点,然后遍历所有其它点,记录每种斜率出现的次数。需要考虑两种特殊情况:斜率不存在和点与固定点重合。

     1 /**
     2  * Definition for a point.
     3  * struct Point {
     4  *     int x;
     5  *     int y;
     6  *     Point() : x(0), y(0) {}
     7  *     Point(int a, int b) : x(a), y(b) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     int maxPoints(vector<Point> &points) {
    13         int n = points.size();
    14         if (n <= 2) {
    15             return n;
    16         }
    17         int ans = 2;
    18         for (int i = 0; i < n - 1; ++i) {
    19             Point o = points[i];
    20             unordered_map<double, int> k_cnt;    //斜率出现计数
    21             int v_cnt = 0;        //垂直线上点计数(含重合点)
    22             int dup_cnt = 0;    //与固定点重合的点计数
    23             for (int j = i + 1; j < n; ++j) {
    24                 Point p = points[j];
    25                 if (p.x == o.x) {
    26                     ++v_cnt;    //垂直线上的点
    27                     if (p.y == o.y) {
    28                         ++dup_cnt;    //与固定点重合的点
    29                     }
    30                 }
    31                 else {
    32                     double k = ((double)p.y - o.y) / (p.x - o.x);
    33                     if (k_cnt.find(k) != k_cnt.end()) {
    34                         ++k_cnt[k];
    35                     }
    36                     else {
    37                         k_cnt[k] = 1;
    38                     }
    39                 }
    40             }
    41             for (auto &c : k_cnt) {
    42                 if (c.second + dup_cnt + 1 > ans) {
    43                     ans = c.second + dup_cnt + 1;
    44                 }
    45             }
    46             if (v_cnt + 1 > ans) {
    47                 ans = v_cnt + 1;
    48             }
    49         }
    50         return ans;
    51     }
    52 };
  • 相关阅读:
    HDU2586 How far away?(tarjan的LCA)
    You Raise Me Up
    POJ2891 Strange Way to Express Integers(中国剩余定理)
    POJ2142 The Balance(扩展欧几里得)
    HDU 1166模仿大牛写的线段树
    NetWord Dinic
    HDU 1754 线段树裸题
    hdu1394 Minimum Inversion Number
    hdu2795 Billboard
    【完全版】线段树
  • 原文地址:https://www.cnblogs.com/dengeven/p/3778648.html
Copyright © 2011-2022 走看看