法一:暴力解法
def
solution1
(alist)
: count =
0for i in
range
(len
(alist)):
product =
1for j in
range
(i,len
(alist)):
product *= alist[j]
if(product>=k)
:break
count +=
1return count
法二:計算當前累乘值,並且每一次判斷當前值和歷史值相比
該題用到了數學技巧。
我們確定了視窗的大小後,就可以統計子陣列的個數了,就是視窗的大小。為啥呢,比如[5 2 6]這個視窗,k還是100,右邊界剛滑到6這個位置,這個視窗的大小就是包含6的子陣列乘積小於k的個數,即[6], [2 6], [5 2 6],正好是3個。所以視窗每次向右增加乙個數字,然後左邊去掉需要去掉的數字後,視窗的大小就是新的子陣列的個數,每次加到結果res中即可
def
solution2
(alist)
: product =
1#i指標維護左邊視窗
j=0res=
0for 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=
0r=0globa,local=0,
0while l< r:
if l< r and local local*=alist[r]
r+=1else
: local/=num[l]
l+=1if local >= k:
globa=
min(globa,r-l+
1)
乘積小於k的子陣列
給定乙個正整數陣列 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的子陣列。說明 定義兩...
713 乘積小於K的子陣列
題目描述 給定乙個正整數陣列 nums。找出該陣列內乘積小於 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的...
陣列演算法 乘積小於K的子區間個數
題目 現給出乙個元素全為正整數的陣列nums和乙個正數k,計算nums裡面元素乘積小於k的子區間個數。leetcode 713 例子 輸入 nums 10,5,2,6 k 100 輸出 8 解釋 8個子區間分別是 10 5 2 6 10,5 5,2 2,6 5,2,6 注意到 10,5,2 的乘積是...