题目描述
给你一个二维数组 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
只包含小写英文字母。
AC代码
class Solution {
public:
int maxPointsInsideSquare(vector<vector<int>>& points, string s) {
int len = s.length();
vector<int> mind(26, 1000000001); //带参数构造vector,对应26个字母的最短边长min_distance
int minl = 1000000001; //最短半边长min_length
for (int i = 0; i < len; ++i) { //遍历坐标
int dis = max(abs(points[i][0]), abs(points[i][1]));
if (dis < mind[s[i] - 'a']) { //小于标签最小值则更新标签最小值与半边长
minl = min(minl, mind[s[i] - 'a']);
mind[s[i] - 'a'] = dis;
}
else if (dis < minl) //大于等于标签最小值,更新合法正方形半边长
minl = dis;
}
//统计合法正方形中点的个数
int re = 0;
for (int i = 0; i < 26; i++) {
if (mind[i] < minl) re++;
}
return re;
}
};