给你一个下标从 0 开始、由 n
个整数组成的数组 arr
。
arr
中两个元素的 间隔 定义为它们下标之间的 绝对差 。更正式地,arr[i]
和 arr[j]
之间的间隔是 |i - j|
。
返回一个长度为 n
的数组 intervals
,其中 intervals[i]
是 arr[i]
和 arr
中每个相同元素(与 arr[i]
的值相同)的 间隔之和 。
注意:|x|
是 x
的绝对值。
示例 1:
输入:arr = [2,1,3,1,2,3,3] 输出:[4,2,7,2,4,4,5] 解释: - 下标 0 :另一个 2 在下标 4 ,|0 - 4| = 4 - 下标 1 :另一个 1 在下标 3 ,|1 - 3| = 2 - 下标 2 :另两个 3 在下标 5 和 6 ,|2 - 5| + |2 - 6| = 7 - 下标 3 :另一个 1 在下标 1 ,|3 - 1| = 2 - 下标 4 :另一个 2 在下标 0 ,|4 - 0| = 4 - 下标 5 :另两个 3 在下标 2 和 6 ,|5 - 2| + |5 - 6| = 4 - 下标 6 :另两个 3 在下标 2 和 5 ,|6 - 2| + |6 - 5| = 5
示例 2:
输入:arr = [10,5,10,10] 输出:[5,0,3,4] 解释: - 下标 0 :另两个 10 在下标 2 和 3 ,|0 - 2| + |0 - 3| = 5 - 下标 1 :只有这一个 5 在数组中,所以到相同元素的间隔之和是 0 - 下标 2 :另两个 10 在下标 0 和 3 ,|2 - 0| + |2 - 3| = 3 - 下标 3 :另两个 10 在下标 0 和 2 ,|3 - 0| + |3 - 2| = 4
提示:
n == arr.length
1 <= n <= 105
1 <= arr[i] <= 105
C++
class Solution {
public:
vector<long long> getDistances(vector<int>& arr) {
int n=arr.size();
vector<long long> res(n,0);
unordered_map<int,vector<int>> mp;
for(int i=0;i<n;i++) {
mp[arr[i]].push_back(i);
}
for(auto it:mp) {
vector<int> vec=it.second;
int m=vec.size();
vector<long> left(m,0);
vector<long> right(m,0);
for(int k=1;k<m;k++) {
left[k]=left[k-1]+k*(vec[k]-vec[k-1]);
}
for(int k=m-2;k>=0;k--) {
right[k]=right[k+1]+(m-1-k)*(vec[k+1]-vec[k]);
}
for(int k=0;k<m;k++) {
res[vec[k]]=left[k]+right[k];
}
}
return res;
}
};
java
class Solution {
public long[] getDistances(int[] arr) {
int n = arr.length;
long[] res = new long[n];
Map<Integer, List<Integer>> mp = new HashMap<>();
for (int i = 0; i < n; i++) {
List<Integer> list = mp.getOrDefault(arr[i], new ArrayList<>());
list.add(i);
mp.put(arr[i], list);
}
for (Map.Entry<Integer, List<Integer>> entry : mp.entrySet()) {
List<Integer> list = entry.getValue();
int m = list.size();
long[] left = new long[m];
long[] right = new long[m];
for (int k = 1; k < m; k++) {
left[k] = left[k - 1] + k * (list.get(k) - list.get(k - 1));
}
for (int k = m - 2; k >= 0; k--) {
right[k] = right[k + 1] + (m - 1 - k) * (list.get(k + 1) - list.get(k));
}
for (int k = 0; k < m; k++) {
res[list.get(k)] = left[k] + right[k];
}
}
return res;
}
}