LC 1868 [M] Product of Two Run Length Encoded Arrays - ALawliet/algorithms GitHub Wiki
For example, nums = [1,1,1,2,2,2,2,2] is represented by the run-length encoded array encoded = [1,3],[2,5](/ALawliet/algorithms/wiki/1,3],[2,5). Another way to read this is "three 1's followed by five 2's".
class Solution:
def findRLEArray(self, encoded1: List[List[int]], encoded2: List[List[int]]) -> List[List[int]]:
res = []
e1_index = 0
e2_index = 0
while e1_index < len(encoded1) and e2_index < len(encoded2):
# [0] = val, [1] = freq
e1_val, e1_freq = encoded1[e1_index]
e2_val, e2_freq = encoded2[e2_index]
product_val = e1_val * e2_val
product_freq = min(e1_freq, e2_freq) # choose the smaller freq
# in-place subtract the freqs
encoded1[e1_index][1] -= product_freq
encoded2[e2_index][1] -= product_freq
# in-place check and move the pointers if no freq mains
if encoded1[e1_index][1] == 0: e1_index += 1
if encoded2[e2_index][1] == 0: e2_index += 1
# we can just check the last product cause it's in order
if not res or res[-1][0] != product_val: # last val in answer does not match recent val used
# new value and add it to the list
res.append( [product_val, product_freq] )
else:
# old value and just count it
res[-1][1] += product_freq
return res