力扣1685. 有序数组中差绝对值之和
这一题主要是数学的推导,根据题目上需要求这个距离和推导出来前缀和。
题目上说result[i] 等于 sum(|nums[i]-nums[j]|)就是求一个点到其他点的距离和,
我们可以把式子展开也就是去绝对值,当求i前面的点的距离和时为:
nums[i]-nums[0]+...nums[i]-nums[i]
当求i后面的点的距离和的时候时 取反 ,因为题目上说了递增
nums[i+1]-nums[i]...nums[n-1]-nums[i]
对式子进行移项+合并同类项
i+1*nums[i]-sum[i+1]+(sum[n]-sum[i+1])-nums[i]*(n-(i+1))
把相同的合并,其他的可以转化为前缀和
因此完整代码就出来了
int sum[100005];
vector<int> getSumAbsoluteDifferences(vector<int>& nums) {for(int i=0;i<nums.size();i++){sum[i+1]=sum[i]+nums[i];} vector<int> result;for(int i=0;i<nums.size();i++){result.push_back(((i+1)*nums[i]-sum[i+1])+(sum[nums.size()]-sum[i+1])-nums[i]*(nums.size()-i-1));}return result;}
时间复杂度O(n)
这一题主要就是数学推导和对前缀和的运用