本周的算法题是
给定一个正整数数组 nums。找出该数组内乘积小于 k 的连续的子数组的个数
示例 输入: 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的子数组
说明:
0 < nums.length <= 50000
0 < nums[i] < 1000
0 <= k < 10^6
我所思考的办法就是,设置两个数组下标,用以记录。p = q =0。(p为开始遍历后的最左端元素下标,q为最右端元素下标)从q开始遍历,与后面的元素逐个相乘。并判断乘积与k的大小关系。若乘积小于k,则继续向后相乘,并且记录当前数组个数;若大于k,则除以 最左端元素,并将p向前移动。
// p,q如上所述 ,sum为乘积 ,m为数组个数。
for(q;q < iCount;q++){
sum *= nums[q];
while(sum >= k && p <= q){
sum /= nums[p];
p++;
}
m += q - p + 1;
}
思路在刚开始写的时候还是不清晰。以后要先审题,再写。