【力扣刷题】子数组 题单

这两篇博客分别详细介绍了LeetCode的795题和2444题的解决方案,主要涉及数组处理和子数组计数问题。通过贡献法和动态维护边界,计算满足特定条件的子数组数量。算法思路清晰,适用于数组操作和区间查找的场景。
摘要由CSDN通过智能技术生成

795. 区间子数组个数

class Solution {
public:
    int numSubarrayBoundedMax(vector<int>& nums, int left, int right) {
        // 贡献法:考虑子数组[l, r] 的个数 = r - l + 1, 然后考虑当 l 固定时,r 能到哪【nums[i] >= left && nums[i] <= right】
        // from 灵神:https://leetcode.cn/problems/number-of-subarrays-with-bounded-maximum/solutions/1988198/tu-jie-yi-ci-bian-li-jian-ji-xie-fa-pyth-n75l/
        int n = nums.size();
        int ans = 0;
        int l = 0, r = -1;
        for(int i = 0;i < n;i ++ )
        {
            if(nums[i] >= left && nums[i] <= right) r = i; // 当前右端点可行
            if(nums[i] > right) l = i + 1, r = -1; // l 直接跳到i + 1
            if(r != -1) ans += r - l + 1; // l, r 都满足条件的端点 取值可能
        }
        return ans;
    }
};

2444. 统计定界子数组的数目

class Solution {
public:
    long long countSubarrays(vector<int>& nums, int minK, int maxK) {
        /*
            同样考虑子数组[l, r] 在哪里
            r = min(min_i, max_i), l = i0 + 1【i0为不符合范围的数的下标】
            个数 = r - l + 1 = min(min_i, max_i) - i0, 

            from 灵神:https://leetcode.cn/problems/count-subarrays-with-fixed-bounds/solutions/1895713/jian-ji-xie-fa-pythonjavacgo-by-endlessc-gag2/
        */
        typedef long long LL;
        LL ans = 0;
        int min_i = -1, max_i = -1, i0 = -1;
        for(int i = 0;i < nums.size();i ++ ){
            if(nums[i] == minK) min_i = i;
            if(nums[i] == maxK) max_i = i;

            if(nums[i] < minK || nums[i] > maxK) i0 = i;
            ans += max(min(min_i, max_i) - i0, 0);
        }
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值