列表

详情


NC405. 乘积小于K的子数组数量

描述

给定一个长度为 n 的正整数数组 nums , 请你找出这个数组中乘积小于 k 的连续子数组的个数。

数据范围: , 数组中的值满足

示例1

输入:

[10,5,3,7],100

输出:

7

说明:

八个子数组分别是
10
5
3
7
10 5
5 3
3 7

示例2

输入:

[10,5,3,7],0

输出:

0

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 17ms, 内存消耗: 2976KB, 提交时间: 2022-07-31

class Solution {
  public:
    int z = 0;
    int subarrayCnt(vector<int>& nums, int k) {
        for (int i = 0; i < nums.size(); i++) {
            multiply(nums, k, 0, i);
        }
        return z;
    }

    void multiply(vector<int>& nums, int k, int sum, int h) {
        if (h == nums.size() )  return;
        
        if (sum == 0) sum = nums[h];
        else {
            sum *= nums[h];
        }
        
        if (sum >= k) return;
        else z++;
        multiply(nums, k, sum, h + 1);
    }
};

C++ 解法, 执行用时: 18ms, 内存消耗: 2976KB, 提交时间: 2022-05-06

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param k int整型 
     * @return int整型
     */
    int res=0;
    int subarrayCnt(vector<int>& nums, int k) {
        // write code here
          for(int i=0;i<nums.size();i++){
              backtrack(nums,k,0,i);
          }
          return res;
    }


    void backtrack(vector<int>& nums, int k, int sum, int index){
        
        if(index == nums.size() )  return;    //终止条件
        
        
        if(sum==0) sum=nums[index];
        else {sum*=nums[index];}
        
        if(sum>=k) return;
        else res++;
        
        
        
        backtrack(nums,k,sum,index+1);
    }
};

C++ 解法, 执行用时: 19ms, 内存消耗: 2968KB, 提交时间: 2022-05-01

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param k int整型 
     * @return int整型
     */
    int subarrayCnt(vector<int>& nums, int k) {
        // write code here
        long sum = 1;
        int start = 0;
        int res = 0;
        for (int i = 0; i < nums.size(); i++) {
            sum = sum * nums[i];
            while (sum >= k && start <= i) {
                sum = sum / nums[start++];
            }
            res += (i - start + 1);
        }
        return res;
    }
};

C 解法, 执行用时: 20ms, 内存消耗: 2600KB, 提交时间: 2022-08-01

int subarrayCnt(int* nums, int numsLen, int k ) {
    int a = 0, b = 1, z = 0;
    for (int i = 0; i < numsLen; i++) {
        b = b * nums[i];
        while (b >= k && a <= i) {
            b = b / nums[a++];
        }
        if (b < k) {
            z += i - a + 1;
        }
    }
    return z;
}

C 解法, 执行用时: 20ms, 内存消耗: 2604KB, 提交时间: 2022-06-28

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @param numsLen int nums数组长度
 * @param k int整型 
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */

int subarrayCnt(int* nums, int numsLen, int k ) {
    int begin = 0, current = 1, totalCount = 0;
    
    for (int i = 0; i < numsLen; i++) {
        current *= nums[i];
        
        while(current >= k && begin <= i) {
            current = current / nums[begin++];
        }
        
        if (current < k) {
            totalCount += i - begin + 1;
        }
    }
    
    return totalCount;
}




上一题