滑动窗口解乘积小于K的子数组

Posted 勇敢*牛牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了滑动窗口解乘积小于K的子数组相关的知识,希望对你有一定的参考价值。

来源:leetCode第713题
难度:中

给你一个整数数组nums和一个整数k,
请你返回子数组内所有元素的乘积严格小于k的连续子数组的数目。

  • 这题说的是找出子数组内所有元素的乘积严格小于k的连续子数组的数目。
  • 我们可以使用滑动窗口来解决,使用两个指针,一个指向窗口的右边,一个指向窗口的左边,窗口内所有元素的乘积必须小于k。如果窗口内元素的乘积大于等于k,我们就移动窗口的左边界……
  • 直到窗口内所有元素的乘积小于k为止。
  • 而满足条件的子数组的数目我们以窗口右边界为结尾的子数组数量,这样做的目的主要是为了防止重复统计

其实很容易理解,窗口的右边界是始终往右边移的,但窗口的左边界需不需要往右边移需要看窗口内的元素是否满足条件,我们这里可以总结一个滑动窗口的模板

int fun(参数) 

    一些需要的变量

     //窗口变量,根据不同的题选择不同的数据结构window

    int left = 0; // 窗口的左边界
    int right = 0; // 窗口的右边界
    while (right < nums.length) 
        窗口window的计算

        // 如果窗口不满足条件,窗口的左边往右移……
        // 直到满足条件为止
        while (窗口满足条件的判断) 
            窗口window左边指针往右移
        

        走到这一步说明窗口满足条件,一些需要的计算

        // 窗口右边要始终右移
        right++;
    
    return  返回结果

题目计算:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int fun(int nums[],int n,int k)
	int left=0,right=0;
	int sum = 1;
	int res=0; 
	while(right<n)
		sum *= nums[right];
		while(sum >= k && left <= right)
			sum /= nums[left++];
		
		res += right - left+1;
		
		right++; 
	
	return res;

int main() 
	int nums[] = 10,5,2,6,n=4,k = 100;
	printf("%d",fun(nums,n,k));
	return 0;

以上是关于滑动窗口解乘积小于K的子数组的主要内容,如果未能解决你的问题,请参考以下文章

刷题日记乘积小于K的子数组

刷题日记乘积小于K的子数组

刷题日记乘积小于K的子数组

713. 乘积小于K的子数组

python-leetcode713-双指针乘积小于k的子数组

数组713. 乘积小于K的子数组