
链接: 6136. 算术三元组的数目

定级Easy。
由于数字不重复(严格递增),因此可以利用哈希表达到线性复杂度。
class Solution:
def arithmeticTriplets(self, nums: List[int], diff: int) -> int:
n = len(nums)
t = {v:i for i,v in enumerate(nums)}
ans = 0
for i,v in enumerate(nums):
a,b = v +diff,v+2*diff
if a in t and b in t and i<t[a]<t[b]:
ans += 1
return ans

定级Medium。
比较裸,建图的时候去掉受限节点,然后从0开始,floodfill。
最后返回搜索到的节点个数。
class Solution:
def reachableNodes(self, n: int, es: List[List[int]], restricted: List[int]) -> int:
r = set(restricted)
g = defaultdict(list)
for u,v in es:
if u not in r and v not in r:
g[u].append(v)
g[v].append(u)
vis = set()
def dfs(u):
vis.add(u)
for v in g[u]:
if v not in vis:
dfs(v)
dfs(0)
return len(vis)

定级Medium。
很难,一开始写栈+回溯坐大牢。
class Solution:
def validPartition(self, nums: List[int]) -> bool:
st = []
n = len(nums)
dp = [False] * n
if nums[0] == nums[1]:
dp[1] = True
for i in range(2,n):
v = nums[i]
if v == nums[i-1] and dp[i-2]:
dp[i] = True
continue
if v == nums[i-1] == nums[i-2] and (i-2==0 or dp[i-3] ):
dp[i] = True
continue
# print(i,nums[i-1]+1 , nums[i-2]+2 ,i-2,dp[i-3])
if v == nums[i-1]+1 == nums[i-2]+2 and(i-2==0 or dp[i-3]):
dp[i] = True
continue
# print(dp)
return dp[n-1]
链接: 6138. 最长理想子序列

定级Hard。
想了半天LIS其实不对,这题可以直接DP。开一个长度26的dp数组。
class Solution:
def longestIdealString(self, s: str, k: int) -> int:
s = [ord(c)-ord('a') for c in s]
dp = [0] *26
for i,v in enumerate(s):
dp[v] = max(dp[j]+1 for j in range(max(0,v-k),min(25,v+k)+1))
return max(dp)