3143正方形中的最多点数

给你一个二维数组 points 和一个字符串 s ,其中 points[i] 表示第 i 个点的坐标,s[i] 表示第 i 个点的 标签 。

如果一个正方形的中心在 (0, 0) ,所有边都平行于坐标轴,且正方形内 不 存在标签相同的两个点,那么我们称这个正方形是 合法 的。

请你返回 合法 正方形中可以包含的 最多 点数。

注意:

  • 如果一个点位于正方形的边上或者在边以内,则认为该点位于正方形内。
  • 正方形的边长可以为零。

示例 1:

img1

输入:points = [[2,2],[-1,-2],[-4,4],[-3,1],[3,-3]], s = "abdca"

输出:2

解释:

边长为 4 的正方形包含两个点 points[0] 和 points[1] 。

示例 2:

img2

输入: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 只包含小写英文字母。

Solution 1

排序+set
时间复杂度O(nlogn)
空间复杂度O(n)

class Solution:
    def maxPointsInsideSquare(self, points: [[int]], s: str) -> int:
        result = 0
        length = len(points)
        range_label_list = []
        for i in range(length):
            point = points[i]
            label = s[i]
            range_label = [max(abs(point[0]), abs(point[1])), label]
            range_label_list.append(range_label)
        range_label_list.sort(key=lambda x: x[0])
        known_label_set = set()
        valid_cnt = 0
        current_range = -1
        interrupted = False
        for i in range(length):
            range_label = range_label_list[i]
            r, label = range_label
            if r > current_range:
                current_range = r
                result += valid_cnt
                valid_cnt = 0
            if label not in known_label_set:
                known_label_set.add(label)
                valid_cnt += 1
            else:
                interrupted = True
                break
        if not interrupted:
            result += valid_cnt
        return result