列表

详情


NC407. 区间子数组个数

描述

给定一个长度为 n 的整数数组 nums 和两个正整数 l 和 r ,找出 nums 中连续、非空且其中最大元素在范围 [left,right] 内的子数组数目。

数据范围:

示例1

输入:

[2,1,4,6,3],2,4

输出:

6

示例2

输入:

[2,1,4,3],2,3

输出:

3

说明:

[2] , [2,1] , [3]

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 32ms, 内存消耗: 4124KB, 提交时间: 2022-05-05

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param l int整型 
     * @param r int整型 
     * @return int整型
     */
    int countSubarray(vector<int>& nums, int l, int r) {
        // write code here
        int resr=0;
        int resl=0;
        int mr=0;
        int ml=0;
        for(int i=0;i<nums.size();i++){
            if(nums[i]<=r){
                resr+=(i-mr+1);
            }else mr=i+1;
            if(nums[i]<l){
                resl+=(i-ml+1);
            }else ml=i+1;
        }
        return resr-resl;
    }
};

C++ 解法, 执行用时: 33ms, 内存消耗: 4132KB, 提交时间: 2022-08-02

class Solution {
 public:
  int countSubarray(vector<int>& nums, int l, int r) {
    int L = 0, R = 0, x = 0, y = 0;    
    for (int i = 0; i < nums.size(); i++) {
      if (nums[i] <= r) {
        R += (i - x + 1);
      } else x = i + 1;
      if (nums[i] < l) {
        L += (i - y + 1);
      } else y = i + 1;
    }
    return R - L;
  }
};

C++ 解法, 执行用时: 35ms, 内存消耗: 4108KB, 提交时间: 2022-07-06

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param l int整型 
     * @param r int整型 
     * @return int整型
     */
    int countSubarray(vector<int>& nums, int l, int r) {
        // write code here
        int res_left=0,res_right=0;
        int min_left_start=0,min_right_start=0;
        for(int i=0;i<nums.size();++i){
            if(nums[i]<=r){
                res_right+=(i-min_right_start+1);
            }else min_right_start=i+1;
            if(nums[i]<l){
                res_left+=(i-min_left_start+1);
            }else{
                min_left_start=i+1;
            }
        }
        return res_right-res_left;
    }
};

C++ 解法, 执行用时: 36ms, 内存消耗: 4164KB, 提交时间: 2022-08-06

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param l int整型 
     * @param r int整型 
     * @return int整型
     */
    int countSubarray(vector<int>& nums, int l, int r) {
        // write code here
        int resr=0;
        int resl=0;
        int mr=0;
        int ml=0;
        for(int i=0;i<nums.size();i++)
        {
            if(nums[i]<=r)
            {
                resr+=(i-mr+1);
            }
            else
                mr=i+1;
            if(nums[i]<l)
            {
                resl+=(i-ml+1);
            }
            else
                ml=i+1;
        }
        return resr-resl;
    }
};

C++ 解法, 执行用时: 38ms, 内存消耗: 4108KB, 提交时间: 2022-05-02

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param l int整型 
     * @param r int整型 
     * @return int整型
     */
    int countSubarray(vector<int>& nums, int l, int r) {
        // write code here
        int res_left = 0;
        int res_right = 0;
        int min_left_start = 0;
        int min_right_start = 0;
        for (int i = 0; i < nums.size(); i++) {
            if (nums[i] <= r) {
                //min_right_start = i;
                res_right += (i - min_right_start + 1);
            } else {
                min_right_start = i + 1;
            }
            
            if (nums[i] < l) {
                //min_left_start = i;
                res_left += (i - min_left_start + 1);
            } else {
                min_left_start = i + 1;
            }
        }
        //cout << res_right << " " << res_left << endl;
        return res_right - res_left;
    }
};

上一题