Skip to content

Latest commit

 

History

History

356.Line-Reflection

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

356.Line-Reflection

首先,需要确定这些点关于x的对称中心位置,即镜面位置。注意到重复点在本题只算一个点,所以需要借助Set排除重复的干扰。
根据数学关系,易知:x1,x2,...,x_n的对称中心,应该等于(x1+x2+...+x_n)/N

        unordered_set<int>Set;
        for (int i=0; i<N; i++)        
            Set.insert(points[i].first);               
        float x0=0;
        for (auto a:Set)
            x0+=a;
        x0=x0/Set.size();

然后要判断这些点关于x=x0镜面对称,需要先保证对称点都在同一个y坐标上。所以利用Map来对这些点关于y的位置进行分类。

        unordered_map<int,set<int>>Map;
        for (int i=0; i<N; i++)
        {
            Map[points[i].second].insert(points[i].first);
        }

对于每个y位置,都有一个集合包括了若干个不重复的x位置,我们需要保证它们两两关于x0对称。利用了set的自动排序特点,我们可以用双指针从两边往中间夹逼。

        for (auto a:Map)
        {
            vector<int>q(a.second.begin(),a.second.end()); //因为set是有序的,直接导入一个数组中。
            int i=0;
            int j=q.size()-1;
            while (i<=j)
            {
                if (q[i]+q[j]!=x0*2)  // 关于x0对称的判据
                    return false;
                i++;
                j--;
            }
        }

Leetcode Link