开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情
前言
从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!
一、题目描述
给你一个整数数组 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 <= 1050 <= nums[i] <= 1090 <= 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));
}
};
四、总结
看题需要仔细,要先充分的理解题意后再去解题,否则只能是白白浪费功夫。这题的思路很巧妙,而且也让我学习到了如何创建一个函数。