zoukankan      html  css  js  c++  java
  • [LeetCode] 356. Line Reflection 直线对称

    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:

    Input: [[1,1],[-1,1]]
    Output: true
    

    Example 2:

    Input: [[1,1],[-1,-1]]
    Output: false

    Follow up:
    Could you do better than O(n2) ?

    Hint:

    1. Find the smallest and largest x-value for all points.
    2. If there is a line then it should be at y = (minX + maxX) / 2.
    3. For each point, make sure that it has a reflected point in the opposite side.

    Credits:
    Special thanks to @memoryless for adding this problem and creating all test cases.

    这道题给了我们一堆点,问我们存不存在一条平行于y轴的直线,使得所有的点关于该直线对称。题目中的提示给的相当充分,我们只要按照提示的步骤来做就可以解题了。首先我们找到所有点的横坐标的最大值和最小值,那么二者的平均值就是中间直线的横坐标,然后我们遍历每个点,如果都能找到直线对称的另一个点,则返回true,反之返回false,参见代码如下:

    解法一:

    class Solution {
    public:
        bool isReflected(vector<pair<int, int>>& points) {
            unordered_map<int, set<int>> m;
            int mx = INT_MIN, mn = INT_MAX;
            for (auto a : points) {
                mx = max(mx, a.first);
                mn = min(mn, a.first);
                m[a.first].insert(a.second);
            }
            double y = (double)(mx + mn) / 2;
            for (auto a : points) {
                int t = 2 * y - a.first;
                if (!m.count(t) || !m[t].count(a.second)) {
                    return false;
                }
            }
            return true;
        }
    }; 

    下面这种解法没有求最大值和最小值,而是把所有的横坐标累加起来,然后求平均数,基本思路都相同,参见代码如下:

    解法二:

    class Solution {
    public:
        bool isReflected(vector<pair<int, int>>& points) {
            if (points.empty()) return true;
            set<pair<int, int>> pts;
            double y = 0;
            for (auto a : points) {
                pts.insert(a);
                y += a.first;
            }
            y /= points.size();
            for (auto a : pts) {
                if (!pts.count({y * 2 - a.first, a.second})) {
                    return false;
                }
            }
            return true;
        }
    };

    类似题目:

    Max Points on a Line

    参考资料:

    https://leetcode.com/problems/line-reflection/description/

    https://leetcode.com/discuss/107661/48-ms-short-c-solution

    https://leetcode.com/discuss/107761/group-by-y-then-sort-by-x-17ms

    LeetCode All in One 题目讲解汇总(持续更新中...)

  • 相关阅读:
    tp5 生成数据表
    tp5 事务
    时间
    api json
    php 函数学习
    win7 安装Ubuntu18.04 双系统后无法引导win7
    vite笔记
    tp5 excel导出
    tp5 sql查询
    idea 停止运行程序
  • 原文地址:https://www.cnblogs.com/grandyang/p/5579271.html
Copyright © 2011-2022 走看看