本人算法萌新,为秋招找工作开始磨炼算法,算法题均用python实现,如果我有哪些地方做的有问题的,还请大家不吝赐教.
1.题干
给你一个二维数组
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
只包含小写英文字母。
2.思考
这道题我的想法是,找出相同字母,且处于第二位置的点为length的边界点,然后根据这个length的长度,来再扫描一遍点,看看哪些点被包围进去了.
3.代码
from typing import List
class Solution:
def maxPointsInsideSquare(self, points: List[List[int]], s: str) -> int:
n = len(points)
if n == 1:
return 1
s_set = dict()
length = float('inf')
count = 0
# 构造出一个key->[]的map,其中列表为该点的最大边界值
for i in range(n):
if s[i] in s_set.keys():
s_set[s[i]].append(max(abs(points[i][0]), abs(points[i][1])))
else:
s_set[s[i]] = []
s_set[s[i]].append(max(abs(points[i][0]), abs(points[i][1])))
if len(s_set) == n:
return n
# 获取第二位置的点作为length的长度
for key in s_set.keys():
if len(s_set[key]) != 1:
s_set[key].sort()
length = min(length, s_set[key][1] - 1)
for i in range(n):
if abs(points[i][0]) <= length and abs(points[i][1]) <= length:
count += 1
return count
if __name__ == "__main__":
solution = Solution()
points = [[16, 32], [27, 3], [23, -14], [-32, -16], [-3, 26], [-14, 33]]
s = "aaabfc"
print(solution.maxPointsInsideSquare(points, s))
4.总结
对于如何找到第二位置的点,应该还存在更好的方法,我这个用的数据结构感觉有些过于复杂.