数据量100显然暴力模拟。
class Solution:
def unequalTriplets(self, nums: List[int]) -> int:
n = len(nums)
ans = 0
for i in range(n-2):
for j in range(i+1,n-1):
for k in range(j+1,n):
if len({nums[i],nums[j],nums[k]}) == 3:
ans += 1
return ans
class Solution:
def closestNodes(self, root: Optional[TreeNode], queries: List[int]) -> List[List[int]]:
a = set()
def dfs(o):
if not o:
return
a.add(o.val)
dfs(o.left)
dfs(o.right)
dfs(root)
a = sorted(a)
n = len(a)
ans = []
for x in queries:
p = bisect_left(a,x)
if p<n:
if a[p] == x:
ans.append([x,x])
continue
if p:
ans.append([a[p-1],a[p]])
else:
ans.append([-1,a[p]])
else:
ans.append([a[-1],-1])
return ans
链接: 6243. 到达首都的最少油耗
class Solution:
def minimumFuelCost(self, roads: List[List[int]], seats: int) -> int:
n = len(roads) + 1
if n == 1:
return 0
g = [[] for _ in range(n)]
for u,v in roads:
g[u].append(v)
g[v].append(u)
def dfs(u,fa): # 载人数,油耗,车数
s,cost,car = 0,0,0
for v in g[u]:
if v == fa:continue
a,b,c= dfs(v,u)
# print(u,v,a,b,c)
s += a
cost += b
car += c
if u == 0:
return s,cost,car
if s > 0:
s += 1
car = (seats+s-1)//seats
return s,cost+car,car
return s + 1,cost+car+1,car+1
s,cost,car = dfs(0,-1)
return cost
链接: 6244. 完美分割的方案数
MOD = 10**9+7
class Solution:
def beautifulPartitions(self, s: str, k: int, minLength: int) -> int:
n = len(s)
ps = {2,3,5,7}
a = list(map(int,s))
def is_prime(v):
return v in ps
def can_split(j):
return j == 0 or j == n or (not is_prime(a[j-1]) and is_prime(a[j]))
if k*minLength > n or is_prime(a[-1]) or not is_prime(a[0]):
return 0
f = [[0]*(n+1) for _ in range(k+1)]
f[0][0] = 1
for i in range(1,k+1):
s = 0
for j in range(minLength*i,n-(k-i)*minLength+1):
if can_split(j-minLength):
s = (s+f[i-1][j-minLength])%MOD
if can_split(j):
f[i][j] = s
return f[-1][-1]%MOD
考试时的n^3写法
MOD = 10**9+7
class Solution:
def beautifulPartitions(self, s: str, k: int, minLength: int) -> int:
n = len(s)
ps = {2,3,5,7}
if n < minLength:
return 0
if int(s[0]) not in ps:
return 0
if int(s[-1]) in ps:
return 0
a = list(map(int,s))
# print(a)
pp = [-1]
for i in range(1,n-2):
if a[i] not in ps and a[i+1] in ps:
pp.append(i)
if minLength<=2:
return comb(len(pp)-1,k-1)%MOD
# print(pp)
@cache
def f(i,j):
if i == j == 0:
return 1
if i == 0:
return 0
if j <= 0:
return 0
# if a[i-1] in ps:
# return 0
ret = 0
pos = bisect_right(pp,i-minLength-1)
for kk in range(0,pos):
ret = (ret+f(pp[kk]+1,j-1))%MOD
# for p in pp:
# if i-1-p>=minLength:
# # print(p+1,j-1,f(p+1,j-1))
# ret = (ret+f(p+1,j-1))%MOD
return ret
ans = f(n,k)%MOD
f.cache_clear()
return ans