Cho n điểm trên mặt phẳng 2D. Kiểm tra xem có đường thẳng song song trục Y (dạng x = c) sao cho tập điểm sau khi phản chiếu qua đường thẳng đó không thay đổi.
Ví dụ: points = [[1,1],[-1,1]] → true (đường đối xứng là x = 0).
Giải thuật
Tìm minX và maxX của tất cả điểm. Đường đối xứng (nếu có) phải là x = (minX + maxX) / 2. Tức mid = minX + maxX. Với mỗi điểm (x, y), điểm đối xứng là (mid - x, y). Kiểm tra xem điểm đối xứng có trong tập gốc không (dùng set).
Cài đặt C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
bool isReflected(vector<vector<int>>& points) {
set<vector<int>> pointSet;
int n = points.size();
int minVal = INT_MAX, maxVal = INT_MIN;
for (int i = 0; i < n; i++) {
minVal = min(minVal, points[i][0]);
maxVal = max(maxVal, points[i][0]);
pointSet.insert(points[i]);
}
int mid = maxVal + minVal;
for (int i = 0; i < n; i++) {
int x = points[i][0];
int y = points[i][1];
x = mid - x;
if (!pointSet.count({x, y}))
return false;
}
return true;
}
};
int main() {
Solution ob;
vector<vector<int>> v = {{1,1},{-1,1}};
cout << ob.isReflected(v);
return 0;
}
Đầu vào
{{1,1},{-1,1}}
Đầu ra
1