Welcome to Subscribe On Youtube
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) { d.computeIfAbsent(arr[i], k -> new ArrayList<>()).add(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 }