Problem
Design an algorithm that accepts a stream of integers and retrieves the product of the last k
integers of the stream.
Implement the ProductOfNumbers
class:
ProductOfNumbers()
Initializes the object with an empty stream.void add(int num)
Appends the integernum
to the stream.int getProduct(int k)
Returns the product of the lastk
numbers in the current list. You can assume that always the current list has at leastk
numbers.
The test cases are generated so that, at any time, the product of any contiguous sequence of numbers will fit into a single 32-bit integer without overflowing.
Examples
Example 1:
|
|
Constraints:
0 <= num <= 100
1 <= k <= 4 * 10^4
- At most
4 * 104
calls will be made toadd
andgetProduct
. - The product of the stream at any point in time will fit in a 32-bit integer.
Solution
Method 1 - Using Prefix Product
To efficiently solve this, we use prefix products (cumulative product array):
- Maintain a
prefix
list where each element at indexi
holds the product of all the numbers added so far up to thei-th
index. - Adding a number (
add(num)
):- If
num != 0
, appendprefix[-1] * num
toprefix
. - If
num == 0
, reset theprefix
list to[1]
, since any product involving zero is0
.
- If
- Querying (
getProduct(k)
):- If we want the product of the last
k
numbers, calculate it asprefix[-1] / prefix[-k-1]
(or directly divide products to exclude earlier terms). - If
k
exceeds the size of theprefix
, return0
.
- If we want the product of the last
Video explanation
Here is the video explaining this method in detail. Please check it out:
Code
|
|
|
|
Complexity
- ⏰ Time complexity:
- Adding
add(num)
:O(1)
- Querying
getProduct(k)
:O(1)
- Adding
- 🧺 Space complexity:
O(n)
for storing the prefix product array, wheren
is the number ofadd
calls made.