题目描述
给定平面上的n个点,问是否存在一条平行于y轴的直线,使得这n个点相对于这条直线对称。
Follow-up
是否存在一条直线使得这n个点关于这条直线对称?
算法分析
因为对称轴一定平行于y轴,对称轴的特点就是每一个点都在另一边有一个对应的点。最左边的点一定对应某个最右边的点,因此最左边的点和最右边的点的中点应该在对称轴上。
找到了对称轴的位置,我们就可以通过HashMap判断是否每一个点都有对应的点,最后输出答案即可。
时间复杂度为O(n)。
参考程序
#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <algorithm>
using namespace std;
const int INF = 1<<30;
struct Point {
int x;
int y;
Point(int x=0, int y=0) : x(x), y(y) {}
};
vector<Point> points;
map<int, set<int> > pmap;
int main()
{
int n;
while (cin >> n) {
Point p;
for (int i=0; i<n; i++) {
cin >> p.x >> p.y;
points.push_back(p);
}
int maxv = -INF, minv = INF;
for (int i=0; i<points.size(); i++) {
maxv = max(points[i].x, maxv);
minv = min(points[i].x, minv);
pmap[points[i].y].insert(points[i].x);
}
bool flag = true;
for (int i=0; i<points.size(); i++) {
set<int> &setx = pmap[points[i].y];
if (setx.find(maxv + minv - points[i].x) == setx.end()) {
flag = false;
break;
}
}
flag ? cout << "YES\n" : cout << "NO\n";
points.clear();
pmap.clear();
}
return 0;
}