LeetCode 2615. Sum of Distances Solution in Java, C++, Python & More | Explanation + Code

CoderIndeed
0
2615. Sum of Distances

Description

You are given a 0-indexed integer array nums. There exists an array arr of length nums.length, where arr[i] is the sum of |i - j| over all j such that nums[j] == nums[i] and j != i. If there is no such j, set arr[i] to be 0.

Return the array arr.

 

Example 1:

Input: nums = [1,3,1,1,2]
Output: [5,0,3,4,0]
Explanation: 
When i = 0, nums[0] == nums[2] and nums[0] == nums[3]. Therefore, arr[0] = |0 - 2| + |0 - 3| = 5. 
When i = 1, arr[1] = 0 because there is no other index with value 3.
When i = 2, nums[2] == nums[0] and nums[2] == nums[3]. Therefore, arr[2] = |2 - 0| + |2 - 3| = 3. 
When i = 3, nums[3] == nums[0] and nums[3] == nums[2]. Therefore, arr[3] = |3 - 0| + |3 - 2| = 4. 
When i = 4, arr[4] = 0 because there is no other index with value 2. 

Example 2:

Input: nums = [0,5,3]
Output: [0,0,0]
Explanation: Since each element in nums is distinct, arr[i] = 0 for all i.

 

Constraints:

  • 1 <= nums.length <= 105
  • 0 <= nums[i] <= 109

 

Note: This question is the same as 2121: Intervals Between Identical Elements.

Solutions

Solution 1: Hash Map + Prefix Sum

First, use a hash map d to record the list of indices for each element in the array nums, that is, d[x] represents the list of all indices in nums where the value is x.

For each list of indices idx in the hash map d, we can calculate the value of arr[i] for each index i in idx. For the first index idx[0], the sum of distances to all indices on the right is right = ∑_{i=0}m-1 - idx[0] × m. Then, we iterate through idx, and for each iteration, compute ans[idx[i]] = left + right, then update left and right as follows: left = left + (idx[i+1] - idx[i]) × (i+1), and right = right - (idx[i+1] - idx[i]) × (m-i-1).

After the iteration, we obtain the array arr corresponding to each element in nums, which is stored in ans.

The time complexity is O(n) and the space complexity is O(n), where n is the length of the array nums.

PythonJavaC++GoTypeScriptRust
class Solution: def distance(self, nums: List[int]) -> List[int]: d = defaultdict(list) for i, x in enumerate(nums): d[x].append(i) ans = [0] * len(nums) for idx in d.values(): left, right = 0, sum(idx) - len(idx) * idx[0] for i in range(len(idx)): ans[idx[i]] = left + right if i + 1 < len(idx): left += (idx[i + 1] - idx[i]) * (i + 1) right -= (idx[i + 1] - idx[i]) * (len(idx) - i - 1) return ans(code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !