Leetcode 3143正方形中的最多点数
3143正方形中的最多点数
给你一个二维数组 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 只包含小写英文字母。
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