java 蓝桥杯 前缀和

Posted //我是小白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 蓝桥杯 前缀和相关的知识,希望对你有一定的参考价值。

前缀和

什么是前缀和?
假设现在有个数组 arr=[1,2,3,4,5]
用arrSum数组来存储数组arr的前缀和,表示arrSum是arr的前缀和数组

arrSum[0] = arr[0]
arrSum[1] = arr[0]+arr[1]
arrSum[2] = arr[0]+arr[1]+arr[2]
arrSum[3] = arr[0]+arr[1]+arr[2]+arr[3]
arrSum[4] = arr[0]+arr[1]+arr[2]+arr[3]+arr[4]

前缀和的作用
前缀和的作用就是用空间换取时间

在设计算法时,时间复杂度始终是我们关注的重点。我们需要让算法的时间复杂度尽可能低,追求运行效率。有些时候,我们可以通过增加空间占用的方式减少算法的运行时间,这便是空间换时间。

前缀和的最主要目的就是求子数组的和的大小,并且大大的减少时间复杂度,例如:
求arr[1]至arr[3]的和:arrSum[3] - arrSum[0]
求arr的前4项的和 :arrSum[3]

前缀和应用
问题描述
给定一个整数K和一个长度为N整数数组Arr,求数组Arr中和为K的连续的子数组的个数
输入
第一行:一个整数K
第二行:一个整数N
第三行:N个整数,每个整数中间用空格隔开
输出
输出一行包含一个整数
直接上代码

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		//先接收测试数据
		Scanner sc=new Scanner(System.in);
		int count=0;
		int k=sc.nextInt();
		int n=sc.nextInt();
		int[]arr=new int[n];
		int[]arrSum=new int[n];//声明前缀和数组
		for (int i = 0; i < n; i++) {
			arr[i]=sc.nextInt();
		}
		//求前缀和
		for (int i = 0; i < arrSum.length; i++) {
			if(i==0) 
				arrSum[0]=arr[0];
			else
				arrSum[i]=arrSum[i-1]+arr[i];
		}
		//遍历数组的所有子数组,如果子数组的和==k 满足条件 count++
		for (int i = 0; i < n; i++) {
			for (int j = i; j < n; j++) {
				//利用前缀和数组遍历的当前子数组的和
				int subSum=arrSum[j]-arrSum[i]+arr[i];
				if(subSum==k)count++;
			}
		}
		System.out.println(count);
	}
}

以上是关于java 蓝桥杯 前缀和的主要内容,如果未能解决你的问题,请参考以下文章

蓝桥杯AcWing 题目题解 - 二分与前缀和差分

冲击蓝桥杯-并查集,前缀和,字符串

准备2023(2024)蓝桥杯

蓝桥杯 前缀表达式

蓝桥杯——根据手册写底层

第十二届蓝桥杯 2021年国赛真题 (Java 大学B组)