滑动窗口,注意数组个数的规律。
如图所示,在left-right中的滑动窗口中,我们需要将以6为边界的所有数组加入计算中,而不是每次计算所有的。
举例:现有ABCD四个数在滑动窗口内,他们的乘积小于k,所以我们要将ABCD、BCD、CD、D四个数组计算在内。
那么问题来了 BC 必然同样也小于k,我们怎么计算呢?
答案是:在之前的滑动窗口中,我们必然已经经过了以C为边界的滑动数组,在这种情况下,所有以C为边界的数组都会被计算在内,根本不需要考虑其他的部分。
想通了上面的道理,接下来就很好办了。
class Solution { public int numSubarrayProductLessThanK(int[] nums, int k) { int left=0; int res = 1; int count = 0; int right = 0; while(right<nums.length){ res = res * nums[right];//到了right位置 把right乘进去 while(res>=k&&left<right){ res = res / nums[left]; left++;//左侧的指针一直向前,直到res合规合法 } if(res<k){ //res合规的情况下开始计算 count = count + (right - left + 1); //这里有点难以理解 比如说ABCD 我们取以D为界限的所有数组放进去 //ABCD的乘积小于D 那么ABCD BCD CD D 都是要加进去的 一个四个 //这时候left = 0 right = 3 所以就是right-left+1 //那么前面的BC呢?在C作为边界的过程中已经被算进去了!所以不需要。 } right++; } return count; } }