4001. Aggregate Two Time Series
Description
You are given two 2D integer arrays series1 and series2.
Each element in both series is of the form [timestamp, value], where:
timestampis an integer representing the time.valueis an integer representing the value at that timestamp.
Each array is sorted in strictly increasing order of timestamp.
For any timestamp not present in a series, its value is taken from the next available timestamp in the same series if one exists. Otherwise, its value is considered 0.
The aggregated series is formed by summing the corresponding values from both series at every timestamp that appears in either series.
Return the aggregated series as a 2D integer array of [timestamp, summedValue] pairs, sorted in strictly increasing order of timestamp.
Β
Example 1:
Input: series1 = [[1,3],[4,1]], series2 = [[2,2],[5,2]]
Output: [[1,5],[2,3],[4,3],[5,2]]
Explanation:
| Timestamp | series1 | series2 | summedValue |
|---|---|---|---|
| 1 | 3 | 2 | 5 |
| 2 | 1 | 2 | 3 |
| 4 | 1 | 2 | 3 |
| 5 | 0 | 2 | 2 |
Thus, the aggregated series is [[1, 5], [2, 3], [4, 3], [5, 2]].
Example 2:
Input: series1 = [[1,5],[3,1]], series2 = [[2,2]]
Output: [[1,7],[2,3],[3,1]]
Explanation:
| Timestamp | series1 | series2 | summedValue |
|---|---|---|---|
| 1 | 5 | 2 | 7 |
| 2 | 1 | 2 | 3 |
| 3 | 1 | 0 | 1 |
Thus, the aggregated series is [[1, 7], [2, 3], [3, 1]].
Example 3:
Input: series1 = [[1,5]], series2 = [[1000000000,2]]
Output: [[1,7],[1000000000,2]]
Explanation:
At timestamp 1, the next available value in series2 is 2 at timestamp 1000000000. At timestamp 1000000000, there is no later timestamp in series1, so its value is 0. Only timestamps that appear in at least one of the two series are included.
Β
Constraints:
1 <= series1.length, series2.length <= 105series1[i].length == series2[i].length == 21 <= series1[i][0], series2[i][0] <= 1091 <= series1[i][1], series2[i][1] <= 109- Each series is sorted in strictly increasing order of
timestamp.
Solutions
Solution 1: Two Pointers
Both series are strictly increasing by timestamp, so they can be merged with two pointers. Taking the value of the next later timestamp for a missing timestamp is equivalent to: the value at the current pointer can be used directly for earlier missing timestamps in that series.
Let pointers \(i\) and \(j\) point to the two series. While both are not exhausted:
- If \(t_1 = t_2\), output \([t_1, v_1 + v_2]\) and advance both pointers;
- If \(t_1 < t_2\), output \([t_1, v_1 + v_2]\) (series2 uses the current later \(v_2\)) and advance only \(i\);
- If \(t_2 < t_1\), handle symmetrically.
After one series is exhausted, append the remaining points of the other series directly (there is no later timestamp on the opposite side, so its value is \(0\)).
The time complexity is \(O(m + n)\), and the space complexity is \(O(m + n)\), where \(m\) and \(n\) are the lengths of the two series.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | |