这道题刚开始觉得没有多难,但真正做的时候,发现很多细节处理还是很见功底的,看了大神的代码,这些细节处理非常到位。
这道题是找连续子序列,满足乘积小于给定的一个值,一个长度为2的序列,其子序列有3个,长度为3的子序列,子序列有6个。这块处理确实比较棘手,刚开始我的思路是这样的,用一个left和right 指针来确定当前序列的位置,当乘积超过规定的数值,就将前面序列所有的子序列个数加到对应的数值上,但这会让代码显得比较冗长,而且,如果连续两次出现超过规定值的时候,会加大处理的复杂度,这时,看大神的代码发现,序列为1的时候,子序列个数是1,一个长度为2的序列,其子序列有3个,长度为3的子序列,子序列有6个,所以,只要乘积小于规定的值,就加上序列的长度,就可以了。
代码如下:
class Solution {
public:
int numSubarrayProductLessThanK(vector<int>& nums, int k) {
int numSize = nums.size();
if (!numSize) {
return 0;
}
int left = 0;
int right = 0;
int product = nums[0];
int sum = 0;
while(right < numSize) {
if (product < k) {
sum += (right-left+1);
right++;
product *= nums[right];
} else {
product = product/nums[left];
left++;
if (left > right) {
right++;
}
}
}
return sum;
}
};