代码编织梦想

模拟,计算贡献
以当前数字nums[i]为右端点,统计可能分为子数组的左端点。
nums[i]有三种情况:
1.大于right,此时不能作为右段点。
2.在[left, right]区间内此时可以作为右端点,此时可以分为的子数组至少为1,然后可以和之前连续的左端点继续分成新的数组。
3.小于left,此时可以作为右端点,但自己不能单独成为一个数组,需要符合要求的左端点,此时要看左边nums[i - 1]作为右端点可以分成的子数组个数,因为对于一个以nums[i - 1]为右端点的子数组来说,只要加上nums[i]即可成为新的数组

对于一个右端点来说nums[i],如果nums[i][left, right]区间内,则它可以之前除大于right的数组成一个连续的数组,因此它可以和上一个符合要求的右端点nums[j]形成从子数组形成新的数组,也可以和在[j, i]之间的数形成新的连续数组((j, i)中的数一定都是小于left的,一共有i - j个)。因此对于nums[i],其可以分成的数组数 = nums[j] 可以组成的子数组数 + i - j

因此对于一个数nums[i]对结果的贡献:
如果nums[i]大于right,则无法组成子数组,贡献为0。
如果在[left, right]区间内则即可以与前一个符合区间的数nums[j] 在[left, right]组成的数组形成新的数组,也可以和他们之间的数(j, i)组成新的子数组,贡献为nums[j] 可以组成的子数组数 + i - j
如果小于left,则只能和之前连续的数nums[i - 1]组成的子数组组成新的数组,贡献为nums[i - 1] 可以组成的子数组数

class Solution {
public:
    int numSubarrayBoundedMax(vector<int>& nums, int left, int right) {
        int res = 0;
        int fro = 0, count = 0;
        for(int i = 0; i < nums.size(); i++)
        {
            if(nums[i] > right)
            {
                fro = 0;
                count = 0;
                continue;
            }
            int cur = fro;
            if(nums[i] >= left)
            {
                cur += 1 + count;
                count = 0;
            }
            else
                count++;
            res += cur;
            fro = cur;
        }
        return res;
    }
};
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Mr_atopos/article/details/128015973

LeetCode 795. 区间子数组个数--单调栈-爱代码爱编程

区间子数组个数 给定一个元素都是正整数的数组A ,正整数 L 以及 R (L <= R)。 求连续、非空且其中最大元素满足大于等于L 小于等于R的子数组个数。 例如 : 输入: A = [2, 1, 4, 3]

leetcode 795. 区间子数组个数(c++、python)_我很忙2010的博客-爱代码爱编程_统计数组落在子区间的个数

给定一个元素都是正整数的数组A ,正整数 L 以及 R (L <= R)。 求连续、非空且其中最大元素满足大于等于L 小于等于R的子数组个数。 例如 : 输入: A = [2, 1, 4, 3] L = 2 R = 3 输出: 3 解释: 满足条件的子数组: [2], [2, 1], [3]. 注意: L, R  和 A[i] 都是整数,

leetcode 795. 区间子数组个数_head_hard的博客-爱代码爱编程

给定一个元素都是正整数的数组A ,正整数 L 以及 R (L <= R)。 求连续、非空且其中最大元素满足大于等于L 小于等于R的子数组个数。 例如 : 输入:  A = [2, 1, 4, 3] L = 2 R = 3 输出: 3 解释: 满足条件的子数组: [2], [2, 1], [3]. 查找满足小于等于R,大于等于L的字数组可以转化为

LeetCode-795.区间子数组个数-爱代码爱编程

题目: 代码: class Solution { public: int numSubarrayBoundedMax(vector<int>& A, int L, int R) { int n=A.size(); int ans; if(n%2==0) {ans=n/2;ans

Leetcode 795. 区间子数组个数 C++-爱代码爱编程

Leetcode 795. 区间子数组个数 题目 给定一个元素都是正整数的数组A ,正整数 L 以及 R (L <= R)。 求连续、非空且其中最大元素满足大于等于L 小于等于R的子数组个数。 测试样例 : 输入: A = [2, 1, 4, 3] L = 2 R = 3 输出: 3 解释: 满足条件的子数组: [2], [2, 1],

LeetCode 刷题系列 795. 区间子数组个数-爱代码爱编程

题目: 给定一个元素都是正整数的数组A ,正整数 L 以及 R (L <= R)。 求连续、非空且其中最大元素满足大于等于L 小于等于R的子数组个数。 例如 : 输入:  A = [2, 1, 4, 3] L = 2 R = 3 输出: 3 解释: 满足条件的子数组: [2], [2, 1], [3]. 注意: L, R  和 A[i] 都是

LeetCode 202. 快乐数-爱代码爱编程

题目提示会循环,当算到一定次数之后就会出现之前出现的结果,所以这个时候就可以判断这个数不是我们想要的数。如果没出现循环一直计算到为1为止 使用unordered_set class Solution { public: int getSum(int n) { int sum = 0; int temp;

LeetCode 454. 四数相加 II-爱代码爱编程

使用哈希法的经典题目,与两数之和的思路有点像。把暴力法四重循环变成了两个二重循环 class Solution { public: int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, v

leetcode_区间问题_中等_795.区间子数组个数_小城老街的博客-爱代码爱编程

目录 1.题目2.思路3.代码实现(Java) 1.题目 给你一个整数数组 nums 和两个整数:left 及 right 。找出 nums 中连续、非空且其中最大元素在范围 [left, right] 内的

leetcode795. 区间子数组个数_996冲冲冲的博客-爱代码爱编程

滑窗 nums 中连续、非空且其中最大元素在范围 [left, right] 内的子数组 = 最大元素在范围小于等于right的所有数组-最大元素在范围小于等于left的所有数组 def numSubarrayBounde

【leetcode】795.区间子数组个数_schanappi的博客-爱代码爱编程

题目描述 给你一个整数数组 nums 和两个整数:left 及 right 。找出 nums 中连续、非空且其中最大元素在范围 [left, right] 内的子数组,并返回满足条件的子数组的个数。 生成的测试用例

leetcode 795. 区间子数组个数_小张刷题日记的博客-爱代码爱编程

好久没更新啦~最近忙着课题呢 研究生生活感觉有点子没意思 多学习总结 热爱生活!!芜湖~! 题目描述: 给你一个整数数组 nums 和两个整数:left 及 right 。找出 nums 中连续、非空且其中最大元素在范围 [left, right] 内的子数组,并返回满足条件的子数组的个数。 生成的测试用例保证结果符合 32-bit 整数范围。 题

leetcode 459. 重复的子字符串 kmp解法_leetcode 459 kmp-爱代码爱编程

使用KMP的next来解 自己写的代码,比较粗糙 class Solution { public: bool repeatedSubstringPattern(string s) { if(s.si

入门力扣自学笔记205 c++ (题目编号:795)-爱代码爱编程

795. 区间子数组个数 题目: 给你一个整数数组 nums 和两个整数:left 及 right 。找出 nums 中连续、非空且其中最大元素在范围 [left, right] 内的子数组,并返回满足条件的子数组的个数。 生成的测试用例保证结果符合 32-bit 整数范围。 示例 1: 输入:nums = [2,1,4,3], left =