区间加法aaa

本文介绍了一种高效的解决数组更新问题的方法,通过利用区间起点和终点记录操作,并借助前缀和减少计算复杂度。通过实例和findArray类的代码,展示了如何在给定长度的数组和更新操作后,快速计算最终数组状态。
摘要由CSDN通过智能技术生成

假设你有一个长度为 n 的数组,初始情况下所有的数字均为 0,你将会被给出 k​​​​​​​ 个更新的操作。

其中,每个操作会被表示为一个三元组:[startIndex, endIndex, inc],你需要将子数组 A[startIndex …
endIndex](包括 startIndex 和 endIndex)增加 inc。

请你返回 k 次操作后的数组。

示例:

输入: length = 5, updates = [[1,3,2],[2,4,3],[0,2,-2]] 输出: [-2,0,3,5,3]
解释:

初始状态: [0,0,0,0,0] 进行了操作 [1,3,2] 后的状态: [0,2,2,2,0] 进行了操作 [2,4,3]
后的状态: [0,2,5,5,3] 进行了操作 [0,2,-2] 后的状态: [-2,0,3,5,3] 思路:

如果每一次操作都要处理整个区间上的数的话,太麻烦了,容易超时。

所以不妨先仅用区间的起点和终点来记录对整个区间上的操作。

对于操作[start, end, inc], 把nums[start] += inc, nums[end +1] -= inc。

比如对于[0, 0, 0, 0, 0]进行操作[1,3,2],用新的数组进行记录:[0, 2, 0, 0,-2, 0 ]

想要得到处理的结果,则从前往后得到前缀和数组,即[0, 2, 2, 2, 0, 0],弃最后一位不要,因为它只是用来保存操作

class findArray
{
    public int[] getArray(int length,int[][] updates)
    {
        int [] ans = new int[length];
        int startIndex,endIndex,val;
        for(int[] update:updates)
        {
            startIndex=update[0];
            endIndex=update[1];
            val=update[2];
            ans[startIndex]+=val;
            if(endIndex<length-1)
            {
                ans[endIndex+1]-=val;
            }

        }
        for (int i = 1; i < length; i++) {
            ans[i] += ans[i - 1];
        }
        return ans;
    }
}

public class aaaa {
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        findArray array = new findArray();
        int length=5;
        int [][] update= {{1,3,2},{2,4,3},{0,2,-2}};
        int [] a=new int[length];
        a=array.getArray(length, update);
        for(int i=0;i<length;i++)
        {
            System.out.print(a[i]+" ");
        }

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值