题目
思路
思路是利用前缀、后缀数组来减少计数问题,可惜做的时候TLE了。
AC代码
class Solution {
public:
vector<long long> getDistances(vector<int>& arr) {
unordered_map<int,vector<int> > m;
int len=arr.size();
for(int i=0;i<len;++i){
m[arr[i]].emplace_back(i);
//记录每个相同数的下标
}
//要预先处理数组
//用前缀和与后缀和数组来记录与前面数的距离以及与后面数的距离
//处理前缀
vector<long long> pre(len,0),last(len,0);
for(auto it=m.begin();it!=m.end();++it){
int length=it->second.size();
for(int i=0;i<length;++i){
if(i==0) pre[it->second[i]]=0;
else pre[it->second[i]]=pre[it->second[i-1]]+i*(it->second[i]-it->second[i-1]);
}
}
for(auto it=m.begin();it!=m.end();++it){
int length=it->second.size();
for(int i=length-1;i>=0;--i){
if(i==length-1) last[it->second[i]]=0;
else last[it->second[i]]=last[it->second[i+1]]+(length-i-1)*(it->second[i+1]-it->second[i]);
}
}
vector<long long>res(len);
for(int i=0;i<len;++i){
res[i]=pre[i]+last[i];
}
return res;
}
};
后言
感觉力扣周赛好喜欢考前缀、后缀。滑动窗口呀!从这个题可以看到,前缀与后缀不再仅限制于和了,还有其他推广的含义。