Leetcode 3739. Count Subarrays With Majority Element II

1. 解题思路

这一题是Leetcode双周赛169的第四题,是一个hard的题目。但它其实和题目Leetcode 3737是完全一样的,只是后者对于复杂度要求更低,允许通过暴力循环的方式求解。

这一题的核心思路在于一个数值转变,就是构造一个与原数组等长的新数组,其每一个元素的取值仅为1-1,如果该元素与target相同,则取1,反之取为-1

此时,我们要构造一个target为majority的子数组,事实上只需要在新的数组上找到一个子串,使之元素和大于0即可。而后者我们又可以将其转换为一个前序和的问题。要找到任意一个元素作为子串终点时的满足条件的子串的数目,就是考察其之前元素的所有前序和当中有多少严格小于当前元素的前序和的结果即可。此时,我们维护一个有序数组即可对其进行求解。

2. 代码实现

给出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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值