分析题目:非递减,result的每一项当时当前下表对应nums数组的数字与每一位作差的绝对值之和,还是比较好理解的。
算法题嘛都是数学题,分析一下怎么作这个数学题简单一些。
这里用到了前缀和
每次遍历到的数字,以这个数字为中心前后两边分别计算。
代码:
public int[] getSumAbsoluteDifferences(int[] nums) {
int sum = 0;
int len = nums.length;
int[] preSum = new int[len];//前缀和数组
//计算前缀和
for(int i=0;i<len;i++){
sum += nums[i];
preSum[i] = sum;//给前缀和数组赋值
}
//计算每个数的差绝对值之和
int[] result = new int[len];
for(int i=0;i<len;i++){
//前后两部分相加
result[i] = (i+1)*nums[i]-preSum[i]+ preSum[len-1]-preSum[i]-nums[i]*(len-1-i);
}
return result;
}
代码核心主要再最后一个for循环,这里解释一下
上面说了分成前后两部分计算。
前部分:(i+1)*nums[i]-prefixSum[i]
后部分:prefixSum[nums.length-1]-prefixSum[i]-nums[i]*(nums.length-1-i)
将两部分相加就是要得到的结果。
慢慢分析,然后将前后两部分的公式用一个例子代入跟一下就很容易明白了