难度中等1388收藏分享切换为英文接收动态反馈
给定一个含有
n
个正整数的数组和一个正整数target
。找出该数组中满足其和
≥ target
的长度最小的 连续子数组[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回0
。示例 1:
输入:target = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组[4,3]
是该条件下的长度最小的子数组。示例 2:
输入:target = 4, nums = [1,4,4] 输出:1示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1] 输出:0提示:
1 <= target <= 109
1 <= nums.length <= 105
1 <= nums[i] <= 105
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int j=0;//尾指针
int i=0;//头指针
int sum=0;// 和
int suml;//长度
int retL=INT32_MAX;//返回长度 默认最长以更新
for(j;j<nums.size();j++){
sum+=nums[j];
while(sum>=target){
suml = j-i+1;//长度
retL = retL>suml?suml:retL;//判断是否目前最小
sum-=nums[i];//移动头指针前 先剪掉当前头指针所指值
i++;
}
}
// 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
return retL == INT32_MAX ? 0 : retL;
}
};
- 滑动窗口--本质上是前后指针的相对移动,即:一个动,一个不动;一个不动,一个动。之于本题,sum < target时,后(右)指针动,前(左)指针不动;一旦sum >= target,后指针不动(外循环j++之前),前指针移动以缩小窗口。
- 移动窗口时,需要剔除之前窗口内元素
难度中等607收藏分享切换为英文接收动态反馈
给你一个整数数组
nums
和一个整数k
,请你返回子数组内所有元素的乘积严格小于k
的连续子数组的数目。示例 1:
输入:nums = [10,5,2,6], k = 100 输出:8 解释:8 个乘积小于 100 的子数组分别为:[10]、[5]、[2],、[6]、[10,5]、[5,2]、[2,6]、[5,2,6]。 需要注意的是 [10,5,2] 并不是乘积小于 100 的子数组。示例 2:
输入:nums = [1,2,3], k = 0 输出:0提示:
1 <= nums.length <= 3 * 104
1 <= nums[i] <= 1000
0 <= k <= 106
class Solution {
public:
int numSubarrayProductLessThanK(vector<int>& nums, int k) {
int fp=0;
int bp=0;
int hone=1;//记录乘积
int relt=0;
for(fp;fp<nums.size();fp++){
hone*=nums[fp];
while(hone>=k&&bp<=fp){//勿忘约束条件bp<=fp
hone/=nums[bp];
bp++;
}
relt+=fp-bp+1;
}
return relt;
}
};
- relt + = fp - bp + 1;//
如果当前子数组元素乘积 hone大于等于 k,那么我们右移左端点 bp 直到满足当前子数组元素乘积小于 k 或者 bp<fp,那么元素乘积小于 k 的子数组数目为 j fp-bp+1。返回所有数目之和。