#lc10006. 最短子串积问题
最短子串积问题
题目描述
给定一个由 n 个正整数组成的数组 nums,并给出一个正整数 s,请找出数组中元素乘积大于等于 s 的最短连续子数组的长度并输出;若不存在满足条件的子数组,输出 0。
输入格式
共 3 行:
-
第 1 行:整数 n(数组长度)
-
第 2 行:n 个用空格分隔的正整数(数组元素)
-
第 3 行:整数 s(目标乘积)
输出格式
共 1 行:满足条件的最短连续子数组长度;若无解则输出 0。
样例输入
10
1 2 4 6 3 7 1 2 8 7
9
样例输出
2
样例解释
数组中乘积 ≥9 的最短连续子数组有:
-
[2,4](乘积=8,不满足)
-
[4,6](乘积=24≥9,长度2)
-
[3,7](乘积=21≥9,长度2)
-
[2,8](乘积=16≥9,长度2)
因此最短长度为 2。
数据规模与约定
最短子串积讲解视频
基础约束(100% 数据)
-
数组长度:1 ≤ n ≤ 10^4(修正原下限5,覆盖单元素、小数据边界场景)
-
数组元素:1 ≤ nums[i] ≤ 10^6(正整数,保证乘积随窗口扩大单调递增)
-
1 ≤ s ≤ 10^18 (注意s为1的情况)
算法保障约束
- 输入数据保证:滑动窗口算法运行过程中,所有有效窗口内的元素乘积均不超过 10^18,可直接使用long long完成计算,无需编写高精度代码。
解题提示
由于数组内所有元素均为正整数,窗口向右扩大时乘积只会递增不会递减,适合用滑动窗口(毛毛虫法)求解,时间复杂度为O(n)。代码编写时注意:必须用64位整数类型存储乘积,防止数据溢出。