线性DP-2444. 统计定界子数组的数目

2024-04-14 23:09:27 星期日

问题描述

给你一个整数数组 nums 和两个整数 minK 以及 maxK 。
nums 的定界子数组是满足下述条件的一个子数组:
子数组中的 最小值 等于 minK 。
子数组中的 最大值 等于 maxK 。
返回定界子数组的数目。

子数组是数组中的一个连续部分。

示例 1:
输入:nums = [1,3,5,2,7,5], minK = 1, maxK = 5
输出:2
解释:定界子数组是 [1,3,5] 和 [1,3,5,2] 。
示例 2:
输入:nums = [1,1,1,1], minK = 1, maxK = 1
输出:10
解释:nums 的每个子数组都是一个定界子数组。共有 10 个子数组。

提示:
2 <= nums.length <= 105
1 <= nums[i], minK, maxK <= 106

问题求解

  • 简化问题:如果所有数字都在minK和maxK之间,那么该如何快速求解呢?
    考虑以nums[i]结尾的子串,考虑离他最近的minK和maxK的位置取最小值,那么其左侧所有位置加入均满足条件。
  • 考虑原问题
    其实只需要记录最近的离群点位置即可。

本题是难度很高的题目,主要考的思维能力,不是那种模版题。

class Solution:
    def countSubarrays(self, nums: List[int], minK: int, maxK: int) -> int:
        n = len(nums)
        res = 0
        l = -1
        mi = -1
        ma = -1

        for i, num in enumerate(nums):
            if num == minK: mi = i
            if num == maxK: ma = i
            if num < minK or num > maxK: l = i
            if l < min(mi, ma) and min(mi, ma) != -1: res += min(mi, ma) - l
        
        return res
posted @ 2022-10-26 22:34  hyserendipity  阅读(18)  评论(0编辑  收藏  举报