2121. Intervals Between Identical Elements

Description

You are given a 0-indexed array of n integers arr.

The interval between two elements in arr is defined as the absolute difference between their indices. More formally, the interval between arr[i] and arr[j] is |i - j|.

Return an array intervals of length n where intervals[i] is the sum of intervals between arr[i] and each element in arr with the same value as arr[i].

Note: |x| is the absolute value of x.

Example 1:

Input: arr = [2,1,3,1,2,3,3]
Output: [4,2,7,2,4,4,5]
Explanation:
- Index 0: Another 2 is found at index 4. |0 - 4| = 4
- Index 1: Another 1 is found at index 3. |1 - 3| = 2
- Index 2: Two more 3s are found at indices 5 and 6. |2 - 5| + |2 - 6| = 7
- Index 3: Another 1 is found at index 1. |3 - 1| = 2
- Index 4: Another 2 is found at index 0. |4 - 0| = 4
- Index 5: Two more 3s are found at indices 2 and 6. |5 - 2| + |5 - 6| = 4
- Index 6: Two more 3s are found at indices 2 and 5. |6 - 2| + |6 - 5| = 5


Example 2:

Input: arr = [10,5,10,10]
Output: [5,0,3,4]
Explanation:
- Index 0: Two more 10s are found at indices 2 and 3. |0 - 2| + |0 - 3| = 5
- Index 1: There is only one 5 in the array, so its sum of intervals to identical elements is 0.
- Index 2: Two more 10s are found at indices 0 and 3. |2 - 0| + |2 - 3| = 3
- Index 3: Two more 10s are found at indices 0 and 2. |3 - 0| + |3 - 2| = 4


Constraints:

• n == arr.length
• 1 <= n <= 105
• 1 <= arr[i] <= 105

Solutions

• class Solution {
public long[] getDistances(int[] arr) {
Map<Integer, List<Integer>> d = new HashMap<>();
int n = arr.length;
for (int i = 0; i < n; ++i) {
}
long[] ans = new long[n];
for (List<Integer> v : d.values()) {
int m = v.size();
long val = 0;
for (int e : v) {
val += e;
}
val -= (m * v.get(0));
for (int i = 0; i < v.size(); ++i) {
int delta = i >= 1 ? v.get(i) - v.get(i - 1) : 0;
val += i * delta - (m - i) * delta;
ans[v.get(i)] = val;
}
}
return ans;
}
}

• class Solution {
public:
vector<long long> getDistances(vector<int>& arr) {
unordered_map<int, vector<int>> d;
int n = arr.size();
for (int i = 0; i < n; ++i) d[arr[i]].push_back(i);
vector<long long> ans(n);
for (auto& item : d) {
auto& v = item.second;
int m = v.size();
long long val = 0;
for (int e : v) val += e;
val -= m * v[0];
for (int i = 0; i < v.size(); ++i) {
int delta = i >= 1 ? v[i] - v[i - 1] : 0;
val += i * delta - (m - i) * delta;
ans[v[i]] = val;
}
}
return ans;
}
};

• class Solution:
def getDistances(self, arr: List[int]) -> List[int]:
d = defaultdict(list)
n = len(arr)
for i, v in enumerate(arr):
d[v].append(i)
ans = [0] * n
for v in d.values():
m = len(v)
val = sum(v) - v[0] * m
for i, p in enumerate(v):
delta = v[i] - v[i - 1] if i >= 1 else 0
val += i * delta - (m - i) * delta
ans[p] = val
return ans


• func getDistances(arr []int) []int64 {
d := make(map[int][]int)
n := len(arr)
for i, v := range arr {
d[v] = append(d[v], i)
}
ans := make([]int64, n)
for _, v := range d {
m := len(v)
val := 0
for _, e := range v {
val += e
}
val -= m * v[0]
for i, p := range v {
delta := 0
if i >= 1 {
delta = v[i] - v[i-1]
}
val += i*delta - (m-i)*delta
ans[p] = int64(val)
}
}
return ans
}