题解 | #【模板】前缀和#

【模板】前缀和

https://www.nowcoder.com/practice/acead2f4c28c401889915da98ecdc6bf

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int n = in.nextInt();
            int q = in.nextInt();
            int[] arr=new int[n+1];//目标数组,因为下标从1开始,所以多给1
            int index=1;//获取输入值的下标
            while(index<n+1){//获取,从1开始,那么结尾也就自然到了n
                arr[index++]=in.nextInt();
            }
            long[] db=new long[n+1];//前缀和数组,因为默认是0,所以第一个不用处理-->因为有累加和的存在,怕值太大
            index=1;//遍历,求前缀和,从1下标开始
            while(index<n+1){
                db[index]=db[index-1]+arr[index];//所以第一个元素就是0+arr[1]了
                index++;
            }
            //现在有了数组,和数组长度,及其要查询的次数q,及前缀和数组db
            //现在开始处理q次查询了
            while(q>0){//只有--到1的时候,再--一次到0才会出循环
                int l=in.nextInt();
                int r=in.nextInt();
                System.out.println(db[r] - db[l-1]);//输出区间和即可
                q--;//次数--
            }
        }
    }
}

暴力解法:

每一次都求对应区间的和即可,时间复杂度O(N*q)

前缀和:

能快速求出数组中某一个区间的和,这个就是前缀和的作用,与题意符合,所以可以使用

步骤:我们下面的数组下标都从1开始的,不从0开始,原因后面讲

1,预处理出来一个前缀和数组:dp[]

这个数组满足

1.1--->dp[i]表示arr数组中的前i个下标元素的和

如:dp[4]表示arr数组中的前第1,2,3,4个下标的元素和

1.2--->dp[i]=dp[i-1]+arr[i]

2,使用前缀和数组dp[ ]

我们要求的[L,R]的所有元素和:可以用dp[R]-dp[L-1]来表示,直接找到对应下标相减即可

===》现在问题就来了,为什么我们的下标要从1开始,

如果我们从0开始的话dp[L-1]=dp[0-1]=dp[-1],那不就越界了吗,所以不是从0开始的下标

若是题目要求下标从0开始的话,我们可以把这种情况单独拎出来,if(L-1==-1),为dp[0]=0;

[0,R]直接就是dp[R]了不用减一个数了

全部评论

相关推荐

06-12 17:07
沈阳大学 Java
点赞 评论 收藏
分享
05-11 11:48
河南大学 Java
程序员牛肉:我是26届的双非。目前有两段实习经历,大三上去的美团,现在来字节了,做的是国际电商的营销业务。希望我的经历对你有用。 1.好好做你的CSDN,最好是直接转微信公众号。因为这本质上是一个很好的展示自己技术热情的证据。我当时也是烂大街项目(网盘+鱼皮的一个项目)+零实习去面试美团,但是当时我的CSDN阅读量超百万,微信公众号阅读量40万。面试的时候面试官就告诉我说觉得我对技术挺有激情的。可以看看我主页的美团面试面经。 因此花点时间好好做这个知识分享,最好是单拉出来搞一个板块。各大公司都极其看中知识落地的能力。 可以看看我的简历对于博客的描述。这个帖子里面有:https://www.nowcoder.com/discuss/745348200596324352?sourceSSR=users 2.实习经历有一些东西删除了,目前看来你的产出其实很少。有些内容其实很扯淡,最好不要保留。有一些点你可能觉得很牛逼,但是面试官眼里是减分的。 你还能负责数据库表的设计?这个公司得垃圾成啥样子,才能让一个实习生介入数据库表的设计,不要写这种东西。 一个公司的财务审批系统应该是很稳定的吧?为什么你去了才有RBAC权限设计?那这个公司之前是怎么处理权限分离的?这些东西看着都有点扯淡了。 还有就是使用Redis实现轻量级的消息队列?那为什么这一块不使用专业的MQ呢?为什么要使用redis,这些一定要清楚, 就目前看来,其实你的这个实习技术还不错。不要太焦虑。就是有一些内容有点虚了。可以考虑从PR中再投一点产出
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务