NC405. 乘积小于K的子数组数量
描述
示例1
输入:
[10,5,3,7],100
输出:
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; }