Problem: 795. 前缀和
文章目录
- 思路
- 解题方法
- 复杂度
- Code
思路
这是一个前缀和的问题。前缀和是一种预处理方法,通过预处理出一个数组的前缀和,可以在O(1)的时间复杂度内求出任意一个区间的和。 在这个问题中,我们需要求出数组中某个区间的和。首先,我们需要预处理出数组的前缀和。然后,对于每个查询,我们只需要用O(1)的时间复杂度就可以求出区间的和。
解题方法
1.首先,我们需要预处理出数组的前缀和。我们可以创建一个新的数组,其中第i个元素表示原数组中前i个元素的和。这个过程的时间复杂度是O(n)。
2.然后,对于每个查询,我们只需要用O(1)的时间复杂度就可以求出区间的和。具体来说,如果我们要求出区间[a, b]的和,我们只需要计算前缀和数组中第b个元素和第a-1个元素的差。
复杂度
时间复杂度:
O ( n + m ) O(n + m) O(n+m),其中n是数组的长度,m是查询的数量。我们需要O(n)的时间复杂度预处理出前缀和数组,然后对于每个查询,我们只需要O(1)的时间复杂度就可以求出区间的和。
空间复杂度:
O ( n ) O(n) O(n),我们需要额外的空间存储前缀和数组。
Code
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;public class Main {static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));static StreamTokenizer sr = new StreamTokenizer(in);static int MAXN = 100010, MAXM = 100010;static int n, m;static int[] arr = new int[MAXN];public static void main(String[] args) throws IOException {n = nextInt();m = nextInt();for(int i = 1; i <= n; i++) {int num = nextInt();arr[i] = arr[i - 1] + num;}while(m-- > 0) {int a= nextInt();int b = nextInt();out.println(arr[b] - arr[a - 1]);}out.flush();}static int nextInt() throws IOException {sr.nextToken();return (int) sr.nval;}}