子陣列乘積小於k

2021-10-23 09:47:27 字數 1204 閱讀 6433

法一:暴力解法

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 的乘積是...