子数组乘积小于k

给定一个包含正整数的数组alist,计算子数组的个数,这些子数组满足所有元素的乘积小于k

法一:暴力解法

def solution1(alist):
	count =0
	for i in range(len(alist)):
		product =1
		for j in range(i,len(alist)):
			product *= alist[j]
			if(product>=k):
				break
			count +=1
	return count

法二:计算当前累乘值,并且每一次判断当前值和历史值相比
该题用到了数学技巧。
我们确定了窗口的大小后,就可以统计子数组的个数了,就是窗口的大小。为啥呢,比如[5 2 6]这个窗口,k还是100,右边界刚滑到6这个位置,这个窗口的大小就是包含6的子数组乘积小于k的个数,即[6], [2 6], [5 2 6],正好是3个。所以窗口每次向右增加一个数字,然后左边去掉需要去掉的数字后,窗口的大小就是新的子数组的个数,每次加到结果res中即可

def solution2(alist):
	product =1
	#i指针维护左边窗口
	j=0
	res=0
	for i in range(len(alist)):
		product *= alist[i]
			if product > =k:
				#打破窗口
				product/=alist[j]
				j+=1
			#该乘积下的所有子数组乘积都会满足小于等于k,所以i-j+1是所有的子数组。	
			res+=(i-j+1)

	return res

法三:

def solution3(alist):
l=0
r=0
globa,local=0,0
while l< r:
	if l< r and local <k :
		local*=alist[r]
		r+=1
	else:
		local/=num[l]
		l+=1
	if local >= k:
		globa=min(globa,r-l+1)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值