力扣 [713] [中等] [乘积小于K的子数组](耗时过长,待优化)

713. 乘积小于K的子数组

难度中等272收藏分享切换为英文接收动态反馈

给定一个正整数数组 nums和整数 k 。

请找出该数组内乘积小于 k 的连续的子数组的个数。

示例 1:

输入: nums = [10,5,2,6], k = 100
输出: 8
解释: 8个乘积小于100的子数组分别为: [10], [5], [2], [6], [10,5], [5,2], [2,6], [5,2,6]。
需要注意的是 [10,5,2] 并不是乘积小于100的子数组。

示例 2:

输入: nums = [1,2,3], k = 0
输出: 0

提示: 

  • 1 <= nums.length <= 3 * 104
  • 1 <= nums[i] <= 1000
  • 0 <= k <= 106

-----------------------------分割线------------------------------

思路:滑动窗口,快指针往右扩张,若遇到乘积累计大于k时退出,小于k时,统计计数+1

int numSubarrayProductLessThanK(int* nums, int numsSize, int k){
    int i,j;
    int sum = 1;
    int retcnt = 0;
    
    for(i=0;i<numsSize;i++){
        sum = 1;
        for(j=i;j<numsSize;j++){
            #if 0
            //单个元素已经大于k,提前跳出内循环,再乘下去会比k大,没必要
            if(nums[j]>=k){
                break;
            }
            #endif
            sum *= nums[j];
            //提前跳出内循环,再乘下去还会比k大,没必要
            if(sum >= k){
                break;
            }
            retcnt++;
        }
    }
    return retcnt;
}

待优化

1. 没有完全用到滑动窗口,慢指针没根据条件挪动

2. 单个元素可加判断条件,大于k时跳出。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值