题目链接:https://oj.leetcode.com/problems/max-points-on-a-line/
解题思路:
任取一点,求该点与其他所有点的斜率,拥有相同斜率的点处于同一直线上,计算这些点的数量。遍历所有的点,排序得出最大的点数。
代码:
#ifndef MAXPOINTONLINE_H_
#define MAXPOINTONLINE_H_
#include "header.h"
#pragma once
const double INF = 210000000;
struct Point {
int x;
int y;
Point() : x(0), y(0) {}
Point(int a, int b) : x(a), y(b) {}
};
class MaxPointOnLine
{
public:
int maxPoints(vector<Point> &points) {
max_num = 1;
int same_point = 0;
vector<Point>::iterator iteri;
vector<Point>::iterator iterj;
if (points.size() <= 2) {
return points.size();
}
for (iteri = points.begin(); iteri != points.end(); iteri ++) {
Point p = *iteri;
k.clear();
same_point = 0;
for (iterj = iteri + 1; iterj != points.end(); iterj ++) {
if (iteri->x == iterj->x) {
if (iteri->y == iterj->y) {
same_point++;
}
else {
k.push_back(INF);
}
}
else {
k.push_back(double(iteri->y - iterj->y) / (iteri->x - iterj->x));
}
}
int count = 1;
if (k.size() == 0) {
count += same_point;
max_num = (max_num < count) ? count : max_num;
}
else if (k.size() == 1) {
count += (same_point+1);
max_num = (max_num < count) ? count : max_num;
}
else if( k.size() > 1){
std::sort(k.begin(), k.end(), compare);
vector<double>::iterator iter;
for ( iter = k.begin(); iter < k.end()-1; iter++) {
if (*iter == *(iter + 1)) {
count++;
}
else {
count += (same_point + 1);
max_num = (max_num < count) ? count : max_num;
count = 1;
}
}
if (count > 1) {
count += (same_point + 1);
max_num = (max_num < count) ? count : max_num;
}
}
}
return max_num;
}
private:
static bool compare(const double& c1, const double& c2) {
return c1 < c2;
}
vector<double> k;
int max_num;
};
#endif