您的位置:首页 > 其它

LeetCode 149. Max Points on a Line

2016-05-08 04:42 609 查看
#include <unordered_map>
#include <vector>
#include <iostream>
#include <climits>
using namespace std;

struct Point {
int x;
int y;
Point() : x(0), y(0) {}
Point(int a, int b) : x(a), y(b) {}
};

/*
Two caculate two points are on the same line:
(x1, y1), (x2, y2)
We need to cacualte that res = (x1 - x2) / (y1 - y2), push the HashMap[res]++;
However, there are several cases to cacualte res.
1: y1 == y2  --> divisor equals to 0, in this case, we can store INT_MAX as key.
2: x1 == x2 && y1 == y2, duplicate points, we can stop storing it, use a duplicate counter instead.
*/
int maxPoints(vector<Point>& points) {
unordered_map<float, int> hashMap;
int maxCount = 0;
for(int i = 0; i < points.size(); ++i) {
hashMap.clear();
hashMap[INT_MIN] = 0;
int duplicate = 1;
for(int j = 0; j < points.size(); ++j) {
if(j == i) continue; // skip the same point.
if((points[i].x == points[j].x) && (points[i].y == points[j].y)) {duplicate++; continue;}
else if(points[i].x == points[j].x) {hashMap[INT_MIN]++;}
else {
float k = (float)(points[j].y - points[i].y) / (points[j].x - points[i].x);
hashMap[k]++;
}
}
    auto iter = hashMap.begin();
    while(iter != hashMap.end()) {
      maxCount = max(maxCount, iter->second + duplicate);
      iter++;
    }
  }
  return maxCount;
}

int main(void) {
  // contains duplicates.
  vector<Point> test_1{Point(1,1), Point(1, 2), Point(1, 1), Point(1, 1)};
  cout << maxPoints(test_1) << endl;
   // on the same x line.
  vector<Point> test_2{Point(1,1), Point(1, 3), Point(1, 4), Point(1, 5)};
  cout << maxPoints(test_2) << endl;

  // on the same line.
  vector<Point> test_3{Point(1,1), Point(2, 2), Point(3, 3), Point(4, 4)};
  cout << maxPoints(test_3) << endl;

  // on same y line.
  vector<Point> test_4{Point(2,1), Point(3, 1), Point(4, 1), Point(5, 1)};
  cout << maxPoints(test_4) << endl;

  // make a mix.
  vector<Point> test_5{Point(2, 2), Point(3, 3), Point(4, 4), Point(3, 1), Point(4, 1), Point(5, 1), Point(1, 3), Point(1, 4), Point(1, 5)};
  cout << maxPoints(test_5) << endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: