leetcode_1685,有序数组中差绝对值之和

分析题目:非递减,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)

将两部分相加就是要得到的结果。

慢慢分析,然后将前后两部分的公式用一个例子代入跟一下就很容易明白了

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值