【Leetcode】356. Line Reflection
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【Leetcode】356. Line Reflection相关的知识,希望对你有一定的参考价值。
参考技术A Given n points on a 2D plane, find if there is such a line parallel to y-axis that reflect the given points.1 因为要求是所有点都关于这条直线对称,其中一个corner case是,最左边的点和最右边的点也一定是对称的,所以通过最大x值和最小x值,可以找到对应的对称线
2 找到对称线以后,再依次遍历各个点,看是否存在另外一个点和这个点是对称的
3 一个更巧妙的方法:将points sort,这样我们就可以知道x的最大值和最小值,然后用min+max-x替换x。对于每一个point,我们都做上述替换,按道理说,做完上述替换后,如果所有点都关于这条直线对称的话,得到的还是之前的点
4 所以最后可以将得到的所有点再sorted一下,再和之前的进行对比,如果相等,则返回True,否则False
5 上述方法有test case无法通过,比如(-16,1), (16,1), (16,1),也就是有重复点的时候,上述方法不适用
6 所以需要使用set函数将重复的point值留一份,然后再判断用对称线的x值乘以2再减去x在不在set中
Line Reflection -- LeetCode
Given n points on a 2D plane, find if there is such a line parallel to y-axis that reflect the given points.
Example 1:
Given points = [[1,1],[-1,1]]
, return true
.
Example 2:
Given points = [[1,1],[-1,-1]]
, return false
.
Follow up:
Could you do better than O(n2)?
思路:假设如果存在这样的一条对称轴,那么对于一对对称点,它们的X坐标之和应该是个定值。
我们找到所有点中X坐标的最小值和最大值,两者之和就是这个定值。
然后将所有点的坐标记录在set中,然后判断每个点的对称点是否在set中。
时间复杂度O(N)。
1 class Solution { 2 public: 3 bool isReflected(vector<pair<int, int>>& points) { 4 if (points.size() == 0) return true; 5 unordered_set<string> p; 6 int minX = INT_MAX, maxX = INT_MIN; 7 for (int i = 0; i < points.size(); i++) { 8 int x = points[i].first, y = points[i].second; 9 minX = std::min(minX, x); 10 maxX = std::max(maxX, x); 11 string code = std::to_string(x) + "|" + std::to_string(y); 12 p.insert(code); 13 } 14 int sum = minX + maxX; 15 for (int i = 0; i < points.size(); i++) { 16 int x = sum - points[i].first, y = points[i].second; 17 string code = std::to_string(x) + "|" + std::to_string(y); 18 if (p.count(code) == 0) return false; 19 } 20 return true; 21 } 22 };
以上是关于【Leetcode】356. Line Reflection的主要内容,如果未能解决你的问题,请参考以下文章