LeetCode 795.区间子数组个数(c++)

173 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情

前言

从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!

一、题目描述

795.区间子数组个数

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

生成的测试用例保证结果符合 32-bit 整数范围。

示例 1:

输入:nums = [2,1,4,3], left = 2, right = 3
输出:3
解释:满足条件的三个子数组:[2], [2, 1], [3]

示例 2:

输入: nums = [2,9,2,5,6], left = 2, right = 8
输出: 7

提示:

  • 1 <= nums.length <= 105
  • 0 <= nums[i] <= 109
  • 0 <= left <= right <= 109

二、思路分析

这道题目先开始我还看错了,理解错了题意。要好好的把题读明白。它对子数组的上限设置了要求,要求在[left,right]内,但并未对子数组的下限进行限制。这样就会有一个特点,那就是这个满足题意的子数组的长度是多少,它的排列组合就有多少种。

我看到这种思路很好,将求区间 [left,..right] 问题,转换为 [0,..right] 然后再减去 [0,..left-1] 的问题,这样一下子就将整个问题变得简单了起来,只需要设计一个函数,来求在给定某值时其子数组的个数就行了。

三、AC代码

class Solution {
public:
    int numSubarrayBoundedMax(vector<int>& nums, int left, int right) {
        auto f=[&](int x){
            int count=0,y=0;
            for(int i=0;i<nums.size();i++){
                if(nums[i]<=x){
                    y=y+1;
                    count=count+y;  
                }
                else{
                    y=0;
                }
            }
           return count;
        };
        return (f(right)-f(left-1));
    }
};

四、总结

看题需要仔细,要先充分的理解题意后再去解题,否则只能是白白浪费功夫。这题的思路很巧妙,而且也让我学习到了如何创建一个函数。