
class Solution:def countSubarrays(self, nums: List[int], k: int) -> int:n = len(nums)k_idx = 0p = [0] * (n + 1)for i, v in enumerate(nums):p[v] = iwhile nums[k_idx] != k:k_idx += 1# s个比k小,s个比k大# s个比k小,s + 1个比k大left, right = k - 1, n - klefts, rights = [], []# 左边的情况small, big = 0, 0for i in range(k_idx - 1, -1, -1):if nums[i] < k:small += 1else:big += 1lefts.append([small, big])# 右边的情况small, big = 0, 0for i in range(k_idx + 1, n):if nums[i] < k:small += 1else:big += 1rights.append([small, big])ans = 1 # 自己# small - big#print(lefts)#print(rights)lefts_diff = []for small, big in lefts:lefts_diff.append(big - small)rights_diff = []for small, big in rights:rights_diff.append(big - small)# print(lefts_diff)# print(rights_diff)# 两个和要等于0或者1ans = 1 # 自己for diff in lefts_diff:if diff == 0 or diff == 1:ans += 1for diff in rights_diff:if diff == 0 or diff == 1:ans += 1rights_diff.sort()for num in lefts_diff:need1 = -numneed2 = 1 - numi = bisect_left(rights_diff, need1)j = bisect_right(rights_diff, need2)ans += j - ireturn ans
下一篇:保护黄河的句子