LeetCode. 3143. 正方形中的最多点数

91 阅读1分钟

题目

leetcode.cn/problems/ma…

给你一个二维数组 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;
    }
}

题解

leetcode.cn/problems/ma…