陣列演算法 乘積小於K的子區間個數

2021-08-21 06:51:20 字數 934 閱讀 1129

題目:現給出乙個元素全為正整數的陣列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] 的乘積是100,不符合要求.另外注意,所謂區間,必須是連續的,所以不能有[10,2]這樣的組合。

思路:從最左端開始,維護乙個乘積小於k的最大視窗。每次從右邊不斷吞進來乙個數,直到乘積大於k,則再從左邊不斷吐出去乙個數,直到乘積小於k,迴圈。。。視窗會這樣一直蠕動,到達陣列的最右端。

視窗每次吞進右邊的乙個數,並且左邊吐完達到要求時,相當於我們找到了一組新的區間,這些區間是滿足要求的。比如:

k=30

3, 4 ,5, 6, 2, 9,[ 1, 5, 4, ]7, 11, 3, 5

那麼這個區間就對應三個解:(1(5(4))),注意兩點:

1,新大區間與舊大區間的右端不同,所以產生的三個解區間必然不會與之前的解區間有重複;

2,所有的解區間能組成所有解,不會有遺漏。因為假設有個區間 ( i , j ) 是解區間,那麼它必然會被包含在以 j 為右端點的大區間中。

**:

#include#includeusing namespace std;

int main()

cout << res << endl;

delete arr;

} return 0;

}

子陣列乘積小於k

法一 暴力解法 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...

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