目录
- 一、题目
- 二、思路
- 2.1 解题思路
- 2.2 代码尝试
- 2.3 疑难问题
- 三、解法
- 四、收获
- 4.1 心得
- 4.2 举一反三
一、题目
二、思路
2.1 解题思路
2.2 代码尝试
class Solution {
public:int numSubarrayBoundedMax(vector<int>& nums, int left, int right) {int ret=0;//存储子数组个数int r=0,l=0;while(r<nums.size()){//每次遍历到最右边的边界,如果遇到大于右边界的数,那就重置lif(nums[r]<=right){//计算子数组个数,如果是在范围内,左边界不更新,不在范围内,左边界+1if(nums[r]>=left){ret+=r-l+1;r++;}else{ret++;}}else{l=r+1;r++;}}return ret;}
};
2.3 疑难问题
超时了,看看还有没有哪里能优化时间复杂度的
三、解法
class Solution {
public:int numSubarrayBoundedMax(vector<int>& nums, int left, int right) {return count(nums, right) - count(nums, left - 1);}int count(vector<int>& nums, int lower) {int res = 0, cur = 0;for (auto x : nums) {cur = x <= lower ? cur + 1 : 0;res += cur;}return res;}
};作者:力扣官方题解
链接:https://leetcode.cn/problems/number-of-subarrays-with-bounded-maximum/solutions/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
四、收获
4.1 心得
前几天写算法的心得是,写代码要分治地写,把一个大问题分成几个小问题逐步去解决,你一下子肯定是不能写出几百行的解决,一定是子问题解决的堆砌,最后能够解决一个大问题。在做力扣时也是这样,一道难题,要化成很多步骤,一个步骤一个步骤去敲
4.2 举一反三
有左右范围的数子区间,可以一开始思路就是满足右边范围的计数减去不满足左边范围的计数