1
# helper data structure Scout4
def __init__(self, prev_idx=-1, count_of_equal=0):6
# record of index of last identical element7
self.prev_idx = prev_idx9
# count of identical elements so far10
self.count_of_equal = count_of_equal13
# ouput previous index, and count of equal in order14
return iter((self.prev_idx, self.count_of_equal))18
def getDistances(self, arr: List[int]) -> List[int]:22
pre_scout = defaultdict(Scout)23
pre_dist_sum = [0 for _ in range(size)]25
post_scout = defaultdict(Scout)26
post_dist_sum = [0 for _ in range(size)]29
# update for pre_dist_sum table, direction is from left to right30
for i, element in enumerate(arr):32
prev_equal_idx, prev_count_of_equal = pre_scout[element]34
# update pre_dist_sum table if we have identical elements before index i35
if prev_count_of_equal:37
pre_dist_sum[prev_equal_idx]38
+ (i - prev_equal_idx) * prev_count_of_equal41
# update Scout information for current element42
pre_scout[element] = i, prev_count_of_equal + 144
# --------------------------------------------------------------47
# update for pos_dist_sum table, direction is from right to left48
for i, element in reversed([*enumerate(arr)]):50
post_equal_idx, post_count_of_equal = post_scout[element]52
# update post_dist_sum table if we have identical elements after index i53
if post_count_of_equal:55
post_dist_sum[post_equal_idx]56
+ (post_equal_idx - i) * post_count_of_equal59
# update Scout information for current element60
post_scout[element] = i, post_count_of_equal + 163
# Generate final output by definition64
return [pre_dist_sum[i] + post_dist_sum[i] for i in range(size)]