链接: 6361. 对角线上的质数
按题意模拟即可。
class Solution:
def diagonalPrime(self, nums: List[List[int]]) -> int:
p = set()
m,n = len(nums),len(nums[0])
for i in range(n):
p.add(nums[i][i])
p.add(nums[i][n-i-1])
def is_prime(x):
if x <=1:
return False
if x == 2 or x == 3:
return True
for i in range(2,int(x**0.5)+1):
if x % i ==0:
return False
return True
ans = 0
for x in p:
if is_prime(x):
ans = max(ans,x)
return ans
链接: 6360. 等值距离和
class Solution:
def distance(self, nums: List[int]) -> List[int]:
n = len(nums)
d = defaultdict(list)
for i,v in enumerate(nums):
d[v].append(i)
pres = defaultdict(list)
for k,v in d.items():
pres[k] = [0] + list(accumulate(v))
ans = [0] * n
for i,v in enumerate(nums):
p = d[v]
n = len(p)
if len(p)<=1:
continue
pre = pres[v]
pos = bisect_left(p,i)
# print(p,pre,pos)
ans[i] = i*(pos+1) - pre[pos+1] + pre[-1] - pre[pos+1] - i*(n-pos-1)
return ans
链接: 6359. 最小化数对的最大差值
最大值最小化,警觉。
class Solution:
def minimizeMax(self, nums: List[int], p: int) -> int:
n = len(nums)
nums.sort()
def ok(x):
s = 0
i = 0
while i < n-1:
if nums[i+1] - nums[i] <= x:
s += 1
i += 1
i += 1
return s >= p
return bisect_left(range(10**9+1),True,key=ok)
链接: 6353. 网格图中最少访问的格子数
没想到出了上周T4的加强版。
class DSU:
def __init__(self, n):
self.fathers = list(range(n))
def find_fa(self, x):
fs = self.fathers
t = x
while fs[x] != x:
x = fs[x]
while t != x:
fs[t], t = x, fs[t]
return x
def union(self, x: int, y: int) -> bool:
x = self.find_fa(x)
y = self.find_fa(y)
if x == y:
return False
# if self.size[x] > self.size[y]: # 注意如果要定向合并x->y,需要干掉这个;实际上上边改成find_fa后,按轶合并没必要了,所以可以常关
# x, y = y, x
self.fathers[x] = y
return True
class Solution:
def minimumVisitedCells(self, grid: List[List[int]]) -> int:
m,n = len(grid),len(grid[0])
if m==n==1:
return 1
def inside(x,y):
return 0<=x<m and 0<=y<n
rows = [DSU(n+1) for _ in range(m)]
cols = [DSU(m+1) for _ in range(n)]
ans = 1
q = deque([(0,0)])
rows[0].union(0,1)
cols[0].union(0,1)
while q:
ans += 1
for _ in range(len(q)):
x,y = q.popleft()
if x == m-1 and y == n-1:
return ans - 1
mn,mx = min(y+1,n-1),min(grid[x][y]+y,n-1)
dsu1,dsu2 = rows[x],cols[y]
while mn <= mx:
mn = dsu1.find_fa(mn)
if mn <= mx:
if x == m-1 and mn == n-1:
return ans
q.append((x,mn))
dsu1.union(mn,mn+1)
cols[mn].union(x,x+1)
mn += 1
mn,mx = min(x+1,m-1),min(grid[x][y]+x,m-1)
while mn <= mx:
mn = dsu2.find_fa(mn)
if mn <= mx:
if mn == m-1 and y == n-1:
return ans
q.append((mn,y))
dsu2.union(mn,mn+1)
rows[mn].union(y,y+1)
mn += 1
return -1