给定一个包含正整数的数组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)
 
                   
                   
                   
                   本文介绍了三种计算子数组乘积小于特定值k的算法。包括暴力解法、使用数学技巧的优化解法以及另一种未详细说明的方法。通过实例解释了如何确定窗口大小并统计满足条件的子数组数量。
本文介绍了三种计算子数组乘积小于特定值k的算法。包括暴力解法、使用数学技巧的优化解法以及另一种未详细说明的方法。通过实例解释了如何确定窗口大小并统计满足条件的子数组数量。
           
       
           
                 
                 
                 
                 
                 
                
               
                 
                 
                 
                 
                
               
                 
                 扫一扫
扫一扫
                     
              
             
                   631
					631
					
 被折叠的  条评论
		 为什么被折叠?
被折叠的  条评论
		 为什么被折叠?
		 
		  到【灌水乐园】发言
到【灌水乐园】发言                                
		 
		 
    
   
    
   
             
            


 
            