题目
给你一个二维数组 points 和一个字符串 s ,其中 points[i] 表示第 i 个点的坐标,s[i] 表示第 i 个点的 标签 。
如果一个正方形的中心在 (0, 0) ,所有边都平行于坐标轴,且正方形内 不 存在标签相同的两个点,那么我们称这个正方形是 合法 的。
请你返回 合法 正方形中可以包含的 最多 点数。
注意:
- 如果一个点位于正方形的边上或者在边以内,则认为该点位于正方形内。
- 正方形的边长可以为零。
思路
需要返回最多的合法点数, 要求相同标签不能在正方形内
点位的最长边即为正方形的边长,能够包含最多的点数,例如 a: (1,2), a: (3,4) 则 最长的边长为 3 即 4-1 ;只包含1个a
定义一个变量记录点位的长度, 一个集合数组记录相同字符的距离;
如果对相同标签的集合排序,如果 size > 1 则需要对前两个点位进行长度的取舍
最后求出正方形的最长边后将包含的数量返回
代码
class Solution {
public int maxPointsInsideSquare(int[][] points, String s) {
int n = points.length;
int[] disArr = new int[n];
for (int i = 0; i < n; i++) {
int x = points[i][0];
int y = points[i][1];
int distance = Math.max(Math.abs(x), Math.abs(y));
disArr[i] = distance;
}
List<Integer>[] charList = new ArrayList[26];
Arrays.setAll(charList, x -> new ArrayList<>());
char[] charArray = s.toCharArray();
for (int x = 0; x < charArray.length; x++) {
char c = charArray[x];
int distance = disArr[x];
charList[c - 'a'].add(distance);
}
int minDis = Integer.MAX_VALUE;
for (List<Integer> integers : charList) {
Collections.sort(integers);
int size = integers.size();
if (size == 0) {
continue;
}
if (size > 1) {
Integer i = integers.get(0);
Integer i1 = integers.get(1);
boolean equals = i.equals(i1);
if (equals) {
i = i - 1;
} else {
i = Math.max(i, i1) - 1;
}
minDis = Math.min(i, minDis);
}
}
int ans = 0;
for (int i : disArr) {
if (i <= minDis) {
ans++;
}
}
return ans;
}
}