给定一个包含正整数的数组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)