题目描述: 给定一个长度为 n 的整数数组 nums 和两个正整数 l 和 r ,找出 nums 中连续、非空且其中最大元素在范围 [left,right] 内的子数组数目。 代码实现:js 测试样例: 输入: [2,1,4,6,3],2,4 返回值:6
时间: 2024-01-17 11:05:26 浏览: 98
以下是解题思路和代码实现:
解题思路:
1. 定义变量 count,表示符合要求的子数组数目。
2. 定义变量 start 和 end,分别表示子数组的起始和结束位置。
3. 遍历数组 nums,如果当前元素在范围 [l, r] 内,则将 end 后移一位,更新子数组的最大值为当前元素。
4. 如果当前元素不在范围内或者子数组的最大值不在范围内,就将 start 和 end 指针都移到当前位置,重新开始寻找子数组。
5. 对于每个符合要求的子数组,将其长度加到 count 中。
6. 最终返回 count。
代码实现:
```javascript
function countSubarrays(nums, l, r) {
let count = 0;
let start = 0, end = 0;
let max = Number.MIN_SAFE_INTEGER;
for (let i = 0; i < nums.length; i++) {
let num = nums[i];
if (num >= l && num <= r && num >= max) {
end = i;
max = num;
} else if (num < l || num > r) {
start = i + 1;
end = i + 1;
max = Number.MIN_SAFE_INTEGER;
} else {
start = end + 1;
end = start;
max = num;
}
count += end - start + 1;
}
return count;
}
```
测试样例:
```javascript
let nums = [2, 1, 4, 6, 3];
let l = 2, r = 4;
console.log(countSubarrays(nums, l, r)); // 输出 6
```
以上就是一种解题思路和代码实现,不同的人可能有不同的思路和代码实现,但是模板基本相同。