Leetcode 3748. Count Stable Subarrays

  • [Leetcode 3748. Count Stable Subarrays](#Leetcode 3748. Count Stable Subarrays)
    • [1. 解题思路](#1. 解题思路)
    • [2. 代码实现](#2. 代码实现)

1. 解题思路

这一题是Leetcode周赛476的第四题,是一道hard的题目。

这一题其实我自己没算是做出来,看了大佬的解答之后弄出来的,整体思路就是现在原始数组上面找出所有的非递减数组,然后顺序进行整理,然后每一段子数组所能够构成的所有subarray的数目就是 m ( m + 1 ) 2 \frac{m(m+1)}{2} 2m(m+1),其中 m m m为当前这段子数组的长度。

此时,我们就能够构造一个前序和数组,来计算从前往后所有区间内的有效subarray的数目。

最后,对于每一个query,我们只需要考察其区间内包含多少个上述subarray,然后将这一段subarray当中构成的stable subarray加总返回即可。

唯一需要注意的是,对于最左和最后的两端区间,很可能会破坏原始数组的group当中的开头和结尾的位置,因此我们需要单独重新计算一下开头和结尾的两个区间上的stable subarray的个数。

2. 代码实现

给出python代码实现如下:

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-pre
                groups.append([pre, idx-1])
                s.append(m*(m+1)//2)
                pre = idx
            idx += 1
        m = n-pre
        groups.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])-1
            rb = bisect.bisect_right(groups, [r, n])-1
            if lb >= rb:
                return (r-l+1) * (r-l+2)//2
            mid = prefix[rb] - prefix[lb+1]
            left = groups[lb][1] - l + 1
            right = r - groups[rb][0] + 1
            return mid + left * (left+1) // 2 + right * (right+1)//2

        return [query(l, r) for l, r in queries]

提交代码评测得到:耗时436ms,占用内存52.62MB。

相关推荐
月疯7 小时前
PPG研究中暑的算法记录
算法
春日见7 小时前
vscode的AI编程插件推荐:
大数据·ide·vscode·算法·机器学习·编辑器·ai编程
blxr_7 小时前
力扣hot100路径总和Ⅲhttps://leetcode.cn/problems/path-sum-iii/
算法·leetcode·职场和发展
noipp7 小时前
【无标题】
c语言·数据结构·c++·算法
渡众机器人7 小时前
第八届全球校园人工智能算法精英大赛-算法应用赛-渡众机器人智能体对抗挑战赛规则
人工智能·算法·机器人·自动驾驶·自主导航·对抗赛
郝学胜-神的一滴8 小时前
完全二叉树与堆底层原理深度剖析 | 手写C++大顶堆实现
java·开发语言·数据结构·c++·python·算法
青山木8 小时前
Hot 100 --- 缺失的第一个正数
算法·leetcode·哈希算法
农民小飞侠8 小时前
[leetcode] 165. Compare Version Numbers
java·算法·leetcode
装不满的克莱因瓶8 小时前
掌握语义分割经典模型 FCN——从像素分类到端到端分割的奠基之作
人工智能·python·深度学习·算法·机器学习·分类·数据挖掘
学计算机的计算基8 小时前
链表算法上篇:LeetCode 206/234/141/142/160/21 题解与易错点
java·笔记·算法·链表