- [Leetcode 3739. Count Subarrays With Majority Element II](#Leetcode 3739. Count Subarrays With Majority Element II)
- [1. 解题思路](#1. 解题思路)
- [2. 代码实现](#2. 代码实现)
1. 解题思路
这一题是Leetcode双周赛169的第四题,是一个hard的题目。但它其实和题目Leetcode 3737是完全一样的,只是后者对于复杂度要求更低,允许通过暴力循环的方式求解。
这一题的核心思路在于一个数值转变,就是构造一个与原数组等长的新数组,其每一个元素的取值仅为1和-1,如果该元素与target相同,则取1,反之取为-1。
此时,我们要构造一个target为majority的子数组,事实上只需要在新的数组上找到一个子串,使之元素和大于0即可。而后者我们又可以将其转换为一个前序和的问题。要找到任意一个元素作为子串终点时的满足条件的子串的数目,就是考察其之前元素的所有前序和当中有多少严格小于当前元素的前序和的结果即可。此时,我们维护一个有序数组即可对其进行求解。
2. 代码实现
给出python代码实现如下:
python
class Solution:
def countMajoritySubarrays(self, nums: List[int], target: int) -> int:
arr = [1 if num == target else -1 for num in nums]
cumsum = accumulate(arr)
s = [0]
ans = 0
for prefix in cumsum:
idx = bisect.bisect_left(s, prefix)
ans += idx
s.insert(idx, prefix)
return ans
提交代码评测得到:耗时3461ms,占用内存30.58MB。