Leetcode 3748. Count Stable Subarrays
- Leetcode 3748. Count Stable Subarrays
- 1. 解题思路
- 2. 代码实现
- 题目链接:3748. Count Stable Subarrays
1. 解题思路
这一题是Leetcode周赛476的第四题,是一道hard的题目。
这一题其实我自己没算是做出来,看了大佬的解答之后弄出来的,整体思路就是现在原始数组上面找出所有的非递减数组,然后顺序进行整理,然后每一段子数组所能够构成的所有subarray的数目就是m(m+1)2\frac{m(m+1)}{2}2m(m+1),其中mmm为当前这段子数组的长度。
此时,我们就能够构造一个前序和数组,来计算从前往后所有区间内的有效subarray的数目。
最后,对于每一个query,我们只需要考察其区间内包含多少个上述subarray,然后将这一段subarray当中构成的stable subarray加总返回即可。
唯一需要注意的是,对于最左和最后的两端区间,很可能会破坏原始数组的group当中的开头和结尾的位置,因此我们需要单独重新计算一下开头和结尾的两个区间上的stable subarray的个数。
2. 代码实现
给出python代码实现如下:
class Solution:def countStableSubarrays(self, nums: List[int], queries: List[List[int]]) -> List[int]:pre, idx, n = 0, 1, len(nums)groups, s = [], []while idx < n:if nums[idx] < nums[idx-1]:m = idx-pregroups.append([pre, idx-1])s.append(m*(m+1)//2)pre = idxidx += 1m = n-pregroups.append([pre, n-1])s.append(m*(m+1)//2)prefix = list(accumulate(s, initial=0))def query(l, r):lb = bisect.bisect_right(groups, [l, n])-1rb = bisect.bisect_right(groups, [r, n])-1if lb >= rb:return (r-l+1) * (r-l+2)//2mid = prefix[rb] - prefix[lb+1]left = groups[lb][1] - l + 1right = r - groups[rb][0] + 1return mid + left * (left+1) // 2 + right * (right+1)//2return [query(l, r) for l, r in queries]
提交代码评测得到:耗时436ms,占用内存52.62MB。
