面试算法9:乘积小于k的子数组

题目

输入一个由正整数组成的数组和一个正整数k,请问数组中有多少个数字乘积小于k的连续子数组?例如,输入数组[10,5,2,6],k的值为100,有8个子数组的所有数字的乘积小于100,它们分别是[10]、[5]、[2]、[6]、[10,5]、[5,2]、[2,6]和[5,2,6]。

分析

由于我们的目标是求出所有数字乘积小于k的子数组的个数,一旦向右移动指针P1到某个位置时子数组的乘积小于k,就不需要再向右移动指针P1。这是因为只要保持指针P2不动,向右移动指针P1形成的所有子数组的数字乘积就一定小于k。此时两个指针之间有多少个数字,就找到了多少个数字乘积小于k的子数组。

java 复制代码
public class Test {
    public static void main(String[] args) {
        int[] nums = {10, 5, 2, 6};
        int result = numSubarrayProductLessThanK(nums, 100);
        System.out.println(result);
    }

    public static int numSubarrayProductLessThanK(int[] nums, int k) {
        long product = 1;
        int left = 0;
        int count = 0;
        for (int right = 0; right < nums.length; right++) {
            product *= nums[right];
            while (left <= right && product >= k) {
                product /= nums[left++];
            }

            count += right >= left ? right - left + 1 : 0;
        }
        return count;
    }
}
相关推荐
Niuguangshuo9 分钟前
EM算法详解:解密“鸡生蛋“的机器学习困局
算法·机器学习·概率论
a31582380615 分钟前
Android 大图显示策略优化显示(一)
android·算法·图片加载·大图片
一条大祥脚39 分钟前
26.1.9 轮廓线dp 状压最短路 构造
数据结构·c++·算法
鲨莎分不晴1 小时前
反向传播的数学本质:链式法则与动态规划的完美共舞
算法·动态规划
sonadorje1 小时前
逻辑回归中的条件概率
算法·机器学习·逻辑回归
cici158741 小时前
基于Pan-Tompkins算法的ECG信号HRV提取方案
算法
McGrady-1751 小时前
拓扑导航 vs 几何导航的具体实现位置
算法
副露のmagic2 小时前
更弱智的算法学习 day24
python·学习·算法
颜酱2 小时前
前端必备动态规划的10道经典题目
前端·后端·算法
Chan162 小时前
【 Java八股文面试 | JavaSE篇 】
java·jvm·spring boot·面试·java-ee·八股