Product of the Last K Numbers
MediumUpdated: Aug 2, 2025
Practice on:
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 integernumto the stream.int getProduct(int k)Returns the product of the lastknumbers in the current list. You can assume that always the current list has at leastknumbers.
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:
Input:
["ProductOfNumbers","add","add","add","add","add","getProduct","getProduct","getProduct","add","getProduct"]
[[],[3],[0],[2],[5],[4],[2],[3],[4],[8],[2]]
Output:
[null,null,null,null,null,null,20,40,0,null,32]
Explanation:
ProductOfNumbers productOfNumbers = new ProductOfNumbers();
productOfNumbers.add(3); // [3]
productOfNumbers.add(0); // [3,0]
productOfNumbers.add(2); // [3,0,2]
productOfNumbers.add(5); // [3,0,2,5]
productOfNumbers.add(4); // [3,0,2,5,4]
productOfNumbers.getProduct(2); // return 20. The product of the last 2 numbers is 5 * 4 = 20
productOfNumbers.getProduct(3); // return 40. The product of the last 3 numbers is 2 * 5 * 4 = 40
productOfNumbers.getProduct(4); // return 0. The product of the last 4 numbers is 0 * 2 * 5 * 4 = 0
productOfNumbers.add(8); // [3,0,2,5,4,8]
productOfNumbers.getProduct(2); // return 32. The product of the last 2 numbers is 4 * 8 = 32
Constraints:
0 <= num <= 1001 <= k <= 4 * 10^4- At most
4 * 104calls will be made toaddandgetProduct. - 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
prefixlist where each element at indexiholds the product of all the numbers added so far up to thei-thindex. - Adding a number (
add(num)):- If
num != 0, appendprefix[-1] * numtoprefix. - If
num == 0, reset theprefixlist to[1], since any product involving zero is0.
- If
- Querying (
getProduct(k)):- If we want the product of the last
knumbers, calculate it asprefix[-1] / prefix[-k-1](or directly divide products to exclude earlier terms). - If
kexceeds 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:
<div class="youtube-embed"><iframe src="https://www.youtube.com/embed/RYC1iRntyio" frameborder="0" allowfullscreen></iframe></div>
Code
Java
class ProductOfNumbers {
private List<Integer> prefix;
public ProductOfNumbers() {
init();
}
private void init() {
prefix = new ArrayList<>();
prefix.add(1);
}
public void add(int num) {
if (num == 0) {
init();
} else {
prefix.add(prefix.get(prefix.size() - 1) * num);
}
}
public int getProduct(int k) {
int n = prefix.size();
if (k >= n) {
return 0;
}
return prefix.get(n - 1) / prefix.get(n - k - 1);
}
}
Python
class ProductOfNumbers:
def __init__(self) -> None:
self.prefix: list[int] = [1]
def add(self, num: int) -> None:
if num == 0:
self.prefix = [1]
else:
self.prefix.append(self.prefix[-1] * num)
def getProduct(self, k: int) -> int:
if k >= len(self.prefix):
return 0
return self.prefix[-1] // self.prefix[-k-1]
Complexity
- ⏰ Time complexity:
- Adding
add(num):O(1) - Querying
getProduct(k):O(1)
- Adding
- 🧺 Space complexity:
O(n)for storing the prefix product array, wherenis the number ofaddcalls made.