5271. 访问所有点的最小时间
平面上有 n 个点,点的位置用整数坐标表示 points[i] = [xi, yi]。请你计算访问所有这些点需要的最小时间(以秒为单位)。
你可以按照下面的规则在平面上移动:
每一秒沿水平或者竖直方向移动一个单位长度,或者跨过对角线(可以看作在一秒内向水平和竖直方向各移动一个单位长度)。
必须按照数组中出现的顺序来访问这些点。
首先确定两个点之间的移动距离,设dx,dy为两点横纵坐标距离,移动距离最少是max(dx,dy),那结果就是遍历点,求点之间的最小移动距离之和
class Solution(object):
def minTimeToVisitAllPoints(self, points):
"""
:type points: List[List[int]]
:rtype: int
"""
def calc(point1,point2):
dx = abs(point1[0]-point2[0])
dy = abs(point1[1]-point2[1])
return max(dx,dy)
pre = points[0]
ans = 0
for point in points:
ans += calc(pre,point)
pre = point
return ans
5272. 统计参与通信的服务器
这里有一幅服务器分布图,服务器的位置标识在 m * n 的整数矩阵网格 grid 中,1 表示单元格上有服务器,0 表示没有。
如果两台服务器位于同一行或者同一列,我们就认为它们之间可以进行通信。
请你统计并返回能够与至少一台其他服务器进行通信的服务器的数量。
遍历的做法是,直接统计行列上主机的个数,如果发现同行列电脑数目多于1,则认为和其他主机连通统计进答案
class Solution(object):
def countServers(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
n = len(grid)
m = len(grid[0])
cntx = [0]*n
cnty = [0]*m
for i in range(n):
for j in range(m):
if grid[i][j]:
cntx[i]+=1
cnty[j]+=1
ans = 0
for i in range(n):
for j in range(m):
if grid[i][j]:
if cntx[i]>1 or cnty[j]>1:
ans+=1
return ans
5273. 搜索推荐系统
给你一个产品数组 products 和一个字符串 searchWord ,products 数组中每个产品都是一个字符串。
请你设计一个推荐系统,在依次输入单词 searchWord 的每一个字母后,推荐 products 数组中前缀与 searchWord 相同的最多三个产品。如果前缀相同的可推荐产品超过三个,请按字典序返回最小的三个。
请你以二维列表的形式,返回在输入 searchWord 每个字母后相应的推荐产品的列表。
一般这种题目,前缀应该用字典树+dfs
但是考虑这题的查找范围是逐渐缩小的,所以暴力模拟也是可以的。先筛出大致范围,甚至可以不筛。然后固定开始和结尾,如果前部连续不符合搜索头部向后移动,如果后端字母不符合尾部向前固定。
class Solution(object):
def suggestedProducts(self, products, searchWord):
"""
:type products: List[str]
:type searchWord: str
:rtype: List[List[str]]
"""
products.sort()
arr = []
for product in products:
if product[0] == searchWord[0] :
arr.append(product)
ans = []
tmp = 0
tail = len(arr)
for i in range(len(searchWord)):
now = []
cnt = 0
if tmp<tail:
for j in range(tmp,tail):
if j>=tail :
break
if len(arr[j])<=i:
if tmp==j:
tmp+=1
continue
else:
break
if arr[j][i] != searchWord[i]:
if tmp==j:
tmp+=1
continue
else:
tail = j
break
if arr[j][i] == searchWord[i]:
now.append(arr[j])
cnt+=1
if cnt == 3:
break
ans.append(now)
return ans
5274. 停在原地的方案数
有一个长度为 arrLen 的数组,开始有一个指针在索引 0 处。
每一步操作中,你可以将指针向左或向右移动 1 步,或者停在原地(指针不能被移动到数组范围外)。
给你两个整数 steps 和 arrLen ,请你计算并返回:在恰好执行 steps 次操作以后,指针仍然指向索引 0 处的方案数。
由于答案可能会很大,请返回方案数 模 10^9 + 7 后的结果。
记录每个位置在每一步的可行方案数目,steps决定了走的最远的地方(最大的步数steps//2,更远的地方回不来),所以我们的位置只需要统计0~min(steps//2 +1,arrLen),+1包含了起始点。
算法复杂度O(steps^2)
class Solution(object):
def numWays(self, steps, arrLen):
"""
:type steps: int
:type arrLen: int
:rtype: int
"""
limit = min(steps//2 + 1,arrLen)
now = [0]*limit
now[0] = 1
mod = 10**9+7
for i in range(steps):
ans = []
for j in range(limit):
tmp = now[j]
if j > 0:
tmp += now[j-1]
if j+1<limit:
tmp += now[j+1]
ans.append(tmp%mod)
now = ans
return now[0]