给你一个二维数组 points
和一个字符串 s
,其中 points[i]
表示第 i
个点的坐标,s[i]
表示第 i
个点的 标签 。
如果一个正方形的中心在 (0, 0)
,所有边都平行于坐标轴,且正方形内 不 存在标签相同的两个点,那么我们称这个正方形是 合法 的。
请你返回 合法 正方形中可以包含的 最多 点数。
注意:
·
如果一个点位于正方形的边上或者在边以内,则认为该点位于正方形内。
·
正方形的边长可以为零。
示例 1:
输入:points = [[2,2],[-1,-2],[-4,4],[-3,1],[3,-3]], s = "abdca"
输出:2
解释:
边长为 4 的正方形包含两个点 points[0]
和 points[1]
。
示例 2:
输入:points = [[1,1],[-2,-2],[-2,2]], s = "abb"
输出:1
解释:
边长为 2 的正方形包含 1 个点 points[0]
。
示例 3:
输入:points = [[1,1],[-1,-1],[2,-2]], s = "ccd"
输出:0
解释:
任何正方形都无法只包含 points[0]
和 points[1]
中的一个点,所以合法正方形中都不包含任何点。
提示:
·1 <= s.length, points.length <= 105
·points[i].length == 2
·-109 <= points[i][0], points[i][1] <= 109
·s.length == points.length
·points
中的点坐标互不相同。
·s
只包含小写英文字母。
题目大意:计算以原点为中心的正方形最多可以包含的字符的数量。
分析:遍历所有坐标,计算每个字符到原点的最短距离,同时根据字符标签的重复关系维护正方形的最大半径maxdis。得到每个字符到原点的最短距离后枚举所有的最短距离,若最短距离dis[i]<maxdis,则将第i个字符加入到正方形可以包含的字符中,枚举结束后便可得到正方形最多可包含的字符的数量。
class Solution {
public:
int maxPointsInsideSquare(vector<vector<int>>& points, string s) {
int N=points.size(),ans=0,maxdis=INT_MAX;
vector<int> dis(26,INT_MAX);
for(int i=0,d,ch;i<N;++i){
ch=s[i]-'a';
d=max(abs(points[i][0]),abs(points[i][1]));
maxdis=min(maxdis,max(dis[ch],d));
dis[ch]=min(dis[ch],d);
}
for(int ele:dis) if(ele<maxdis) ++ans;
return ans;
}
};