给定一个正整数数组 nums。找出该数组内乘积小于 k 的连续的子数组的个数

本周算法题是找出正整数数组内乘积小于k的连续子数组个数,给出示例及说明。作者思考的办法是设置两个数组下标记录,从一端遍历并判断乘积与k的大小关系,乘积小于k继续相乘并记录个数,大于k则除以最左端元素并移动下标,还提到要先审题再写。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本周的算法题是

给定一个正整数数组 nums。找出该数组内乘积小于 k 的连续的子数组的个数

  示例 输入: 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的子数组
  说明:
    0 < nums.length <= 50000
    0 < nums[i] < 1000
    0 <= k < 10^6

我所思考的办法就是,设置两个数组下标,用以记录。p = q =0。(p为开始遍历后的最左端元素下标,q为最右端元素下标)从q开始遍历,与后面的元素逐个相乘。并判断乘积与k的大小关系。若乘积小于k,则继续向后相乘,并且记录当前数组个数;若大于k,则除以 最左端元素,并将p向前移动。

// p,q如上所述 ,sum为乘积 ,m为数组个数。
for(q;q < iCount;q++){
	sum *= nums[q];
	while(sum >= k && p <= q){
		sum /= nums[p];
		p++;
	}
	m += q - p + 1;
}

思路在刚开始写的时候还是不清晰。以后要先审题,再写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值