前缀和数组——竞争编程中的实现和应用

给定一个大小为n的数组arr[],其前缀和数组是另一个大小相同的数组prefixSum[],因此prefixSum[i]的值是arr[0]+arr[1]+arr[2]…arr[i]。

null

例如:

Input  : arr[] = {10, 20, 10, 5, 15}Output : prefixSum[] = {10, 30, 40, 45, 60}Explanation : While traversing the array, update the element by adding it with its previous element.prefixSum[0] = 10, prefixSum[1] = prefixSum[0] + arr[1] = 30, prefixSum[2] = prefixSum[1] + arr[2] = 40 and so on.

为了填充前缀和数组,我们从索引1运行到last,并继续将当前元素与前缀和数组中的前一个值相加。 以下是实施情况:

C++

// C++ program for Implementing
// prefix sum array
#include <bits/stdc++.h>
using namespace std;
// Fills prefix sum array
void fillPrefixSum( int arr[], int n, int prefixSum[])
{
prefixSum[0] = arr[0];
// Adding present element
// with previous element
for ( int i = 1; i < n; i++)
prefixSum[i] = prefixSum[i - 1] + arr[i];
}
// Driver Code
int main()
{
int arr[] = { 10, 4, 16, 20 };
int n = sizeof (arr) / sizeof (arr[0]);
int prefixSum[n];
fillPrefixSum(arr, n, prefixSum);
for ( int i = 0; i < n; i++)
cout << prefixSum[i] << " " ;
}


JAVA

// Java Program for Implementing
// prefix sum arrayclass
class Prefix {
// Fills prefix sum array
static void fillPrefixSum( int arr[], int n,
int prefixSum[])
{
prefixSum[ 0 ] = arr[ 0 ];
// Adding present element
// with previous element
for ( int i = 1 ; i < n; ++i)
prefixSum[i] = prefixSum[i - 1 ] + arr[i];
}
// Driver code
public static void main(String[] args)
{
int arr[] = { 10 , 4 , 16 , 20 };
int n = arr.length;
int prefixSum[] = new int [n];
fillPrefixSum(arr, n, prefixSum);
for ( int i = 0 ; i < n; i++)
System.out.print(prefixSum[i] + " " );
System.out.println( "" );
}
}
// This Code is Contributed by Saket Kumar


Python3

# Python Program for Implementing
# prefix sum array
# Fills prefix sum array
def fillPrefixSum(arr, n, prefixSum):
prefixSum[ 0 ] = arr[ 0 ]
# Adding present element
# with previous element
for i in range ( 1 , n):
prefixSum[i] = prefixSum[i - 1 ] + arr[i]
# Driver code
arr = [ 10 , 4 , 16 , 20 ]
n = len (arr)
prefixSum = [ 0 for i in range (n + 1 )]
fillPrefixSum(arr, n, prefixSum)
for i in range (n):
print (prefixSum[i], " " , end = "")
# This code is contributed
# by Anant Agarwal.


C#

// C# Program for Implementing
// prefix sum arrayclass
using System;
class GFG {
// Fills prefix sum array
static void fillPrefixSum( int [] arr, int n,
int [] prefixSum)
{
prefixSum[0] = arr[0];
// Adding present element
// with previous element
for ( int i = 1; i < n; ++i)
prefixSum[i] = prefixSum[i - 1] + arr[i];
}
// Driver code
public static void Main()
{
int [] arr = { 10, 4, 16, 20 };
int n = arr.Length;
int [] prefixSum = new int [n];
fillPrefixSum(arr, n, prefixSum);
for ( int i = 0; i < n; i++)
Console.Write(prefixSum[i] + " " );
Console.Write( "" );
}
}
// This Code is Contributed by nitin mittal


PHP

<?php
// PHP program for
// Implementing prefix
// sum array
// Fills prefix sum array
function fillPrefixSum( $arr ,
$n )
{
$prefixSum = array ();
$prefixSum [0] = $arr [0];
// Adding present element
// with previous element
for ( $i = 1; $i < $n ; $i ++)
$prefixSum [ $i ] = $prefixSum [ $i - 1] +
$arr [ $i ];
for ( $i = 0; $i < $n ; $i ++)
echo $prefixSum [ $i ] . " " ;
}
// Driver Code
$arr = array (10, 4, 16, 20);
$n = count ( $arr );
fillPrefixSum( $arr , $n );
// This code is contributed
// by Sam007
?>


Javascript

<script>
// JavaScript Program for Implementing
// prefix sum arrayclass
// Fills prefix sum array
function fillPrefixSum(arr, n, prefixSum)
{
prefixSum[0] = arr[0];
// Adding present element
// with previous element
for (let i = 1; i < n; ++i)
prefixSum[i] = prefixSum[i - 1] + arr[i];
}
let arr = [ 10, 4, 16, 20 ];
let n = arr.length;
let prefixSum = new Array(n);
fillPrefixSum(arr, n, prefixSum);
for (let i = 0; i < n; i++)
document.write(prefixSum[i] + " " );
document.write( "" );
</script>


输出:

10 14 30 50

给定一个大小为n的数组arr[]。给定Q个查询,在每个查询中给定L和R,打印从索引L到R的数组元素之和。

C++14

#include <iostream>
using namespace std;
const int N = 1e5+10;
int a[N];
int pf[N];
int main() {
int n;
cin >> n;
for ( int i=1; i<=n; i++){
cin >> a[i];
if (i==0)
pf[i]=a[i];
else
pf[i] = pf[i-1] + a[i];
//cout<<pf[i];
}
int q;
cin >> q;
while (q--){
int l, r;
cin >> l >> r;
//Calculating sum from l to r.
if (r>n || l<1)
{
cout<< "Please input in range 1 to " <<n<<endl;
break ;
}
if (l==1)
cout << pf[r] << endl;
else
cout << pf[r] - pf[l-1] << endl;
}
return 0;
}


JAVA

import java.util.*;
class GFG {
public static void main(String[] args)
{
int n = 6 ;
int [] a = { 3 , 6 , 2 , 8 , 9 , 2 };
int [] pf = new int [n + 2 ];
pf[ 0 ] = 0 ;
for ( int i = 0 ; i < n; i++) {
pf[i + 1 ] = pf[i] + a[i];
}
int [][] q
= { { 2 , 3 }, { 4 , 6 }, { 1 , 5 }, { 3 , 6 } };
for ( int i = 0 ; i < q.length; i++) {
int l = q[i][ 0 ];
int r = q[i][ 1 ];
// Calculating sum from r to l.
System.out.print(pf[r] - pf[l - 1 ] + "" );
}
}
}
// This code is contributed by umadevi9616


Python3

if __name__ = = '__main__' :
n = 6 ;
a = [ 3 , 6 , 2 , 8 , 9 , 2 ];
pf = [ 0 for i in range (n + 2 )];
for i in range (n):
pf[i + 1 ] = pf[i] + a[i];
q = [ [ 2 , 3 ],[ 4 , 6 ],[ 1 , 5 ],[ 3 , 6 ]];
for i in range ( 4 ):
l = q[i][ 0 ];
r = q[i][ 1 ];
# Calculating sum from r to l.
print (pf[r] - pf[l - 1 ] );
# This code is contributed by gauravrajput1


C#

using System;
public class GFG {
public static void Main(String[] args) {
int n = 6;
int [] a = { 3, 6, 2, 8, 9, 2 };
int [] pf = new int [n + 2];
pf[0] = 0;
for ( int i = 0; i < n; i++) {
pf[i + 1] = pf[i] + a[i];
}
int [,] q = { { 2, 3 }, { 4, 6 }, { 1, 5 }, { 3, 6 } };
for ( int i = 0; i < q.GetLength(0); i++) {
int l = q[i,0];
int r = q[i,1];
// Calculating sum from r to l.
Console.Write(pf[r] - pf[l - 1] + "" );
}
}
}
// This code is contributed by gauravrajput1


C++14

<script>
var n = 6;
var a = [ 3, 6, 2, 8, 9, 2 ];
var pf = Array(n + 2).fill(0);
pf[0] = 0;
for (i = 0; i < n; i++) {
pf[i + 1] = pf[i] + a[i];
}
var q = [ [ 2, 3 ], [ 4, 6 ], [ 1, 5 ], [ 3, 6 ] ];
for (i = 0; i < q.length; i++) {
var l = q[i][0];
var r = q[i][1];
// Calculating sum from r to l.
document.write(pf[r-1] - pf[l - 1] + "<br/>" );
}
// This code is contributed by gauravrajput1
</script>


例子:

Input : n = 6       a[ ] = {3, 6, 2, 8, 9, 2}       q = 4       l = 2, r = 3.       l = 4, r = 6.       l = 1, r = 5.       l = 3, r = 6.
Output :  8          19          28          21

时间复杂性: O(n)

应用:

一个例子问题: 考虑一个大小为n的数组,所有初始值为0。执行从索引“a”到“b”的给定“m”加法操作,并计算数组中的最高元素。添加操作会将100个元素添加到从a到b的所有元素中(包括a和b)。

例子:

Input : n = 5 // We consider array {0, 0, 0, 0, 0}        m = 3.        a = 2, b = 4.        a = 1, b = 3.        a = 1, b = 2.Output : 300Explanation : After I operation -A : 0 100 100 100 0After II operation -A : 100 200 200 100 0After III operation -A : 200 300 200 100 0Highest element : 300

一种简单的方法是运行一个循环’m’次。输入a和b,运行从a到b的循环,将所有元素加100。 使用 前缀和数组 :

1 : Run a loop for 'm' times, inputting 'a' and 'b'.2 : Add 100 at index 'a-1' and subtract 100 from index 'b'.3 : After completion of 'm' operations, compute the prefix sum array.4 : Scan the largest element and we're done.

我们所做的是在“a”处添加100,因为这将在使用前缀和数组时向所有元素添加100。从“b+1”中减去100将逆转从“b”开始向元素添加100所做的更改。 为了更好地理解:

After I operation -A : 0 100 0 0 -100 Prefix Sum Array : 0 100 100 100 0After II operation -A : 100 100 0 -100 -100Prefix Sum Array : 100 200 200 100 0After III operation -A : 200 100 -100 -100 -100Prefix Sum Array : 200 300 200 100 0Final Prefix Sum Array : 200 300 200 100 0 The required highest element : 300

C++14

#include <bits/stdc++.h>
using namespace std;
int find( int m, vector<pair< int , int >> q)
{
int mx = 0;
vector< int > pre(5,0);
for ( int i = 0; i < m; i++)
{
// take input a and b
int a = q[i].first, b = q[i].second;
// add 100 at first index and
// subtract 100 from last index
// pre[1] becomes 100
pre[a-1] += 100;
// pre[4] becomes -100 and this
pre[b] -=100;
// continues m times as we input diff. values of a and b
}
for ( int i = 1; i < 5; i++)
{
// add all values in a cumulative way
pre[i] += pre[i - 1];
// keep track of max value
mx = max(mx, pre[i]);
}
return mx;
}
// Driver Code
int main()
{
int m = 3;
vector<pair< int , int >> q = {{2,4},{1,3},{1,2}};
// Function call
cout<< find(m,q);
return 0;
}


JAVA

import java.util.*;
class GFG{
static class pair
{
int first, second;
public pair( int first, int second)
{
this .first = first;
this .second = second;
}
}
static int find( int m, pair []q)
{
int mx = 0 ;
int []pre = new int [ 5 ];
for ( int i = 0 ; i < m; i++)
{
// take input a and b
int a = q[i].first, b = q[i].second;
// add 100 at first index and
// subtract 100 from last index
// pre[1] becomes 100
pre[a- 1 ] += 100 ;
// pre[4] becomes -100 and this
pre[b] -= 100 ;
// continues m times as we input diff. values of a and b
}
for ( int i = 1 ; i < 5 ; i++)
{
// add all values in a cumulative way
pre[i] += pre[i - 1 ];
// keep track of max value
mx = Math.max(mx, pre[i]);
}
return mx;
}
// Driver Code
public static void main(String[] args)
{
int m = 3 ;
pair[] q = { new pair( 2 , 4 ), new pair( 1 , 3 ), new pair( 1 , 2 )};
// Function call
System.out.print( find(m,q));
}
}
// This code is contributed by gauravrajput1


Python3

# Python implementation of the approach
def find( m, q):
mx = 0
pre = [ 0 for i in range ( 5 ) ]
for i in range (m):
# take input a and b
a,b = q[i][ 0 ], q[i][ 1 ]
# add 100 at first index and
# subtract 100 from last index
# pre[1] becomes 100
pre[a - 1 ] + = 100
# pre[4] becomes -100 and this
pre[b] - = 100 ;
# continues m times as we input diff. values of a and b
for i in range ( 1 , 5 ):
# add all values in a cumulative way
pre[i] + = pre[i - 1 ]
# keep track of max value
mx = max (mx, pre[i])
return mx
# Driver Code
m = 3
q = [[ 2 , 4 ],[ 1 , 3 ],[ 1 , 2 ]]
# Function call
print (find(m,q))
# This code is contributed by rohitsingh07052


C#

using System;
public class GFG{
public class pair
{
public int first, second;
public pair( int first, int second)
{
this .first = first;
this .second = second;
}
}
static int find( int m, pair []q)
{
int mx = 0;
int []pre = new int [5];
for ( int i = 0; i < m; i++)
{
// take input a and b
int a = q[i].first, b = q[i].second;
// add 100 at first index and
// subtract 100 from last index
// pre[1] becomes 100
pre[a-1] += 100;
// pre[4] becomes -100 and this
pre[b] -=100;
// continues m times as we input diff. values of a and b
}
for ( int i = 1; i < 5; i++)
{
// add all values in a cumulative way
pre[i] += pre[i - 1];
// keep track of max value
mx = Math.Max(mx, pre[i]);
}
return mx;
}
// Driver Code
public static void Main(String[] args)
{
int m = 3;
pair[] q = { new pair(2,4), new pair(1,3), new pair(1,2)};
// Function call
Console.Write( find(m,q));
}
}
// This code is contributed by gauravrajput1.


Javascript

<script>
function find( m,q)
{
let mx = 0;
let pre = [0,0,0,0,0];
for (let i = 0; i < m; i++)
{
// take input a and b
let a = q[i][0], b = q[i][1];
// add 100 at first index and
// subtract 100 from last index
// pre[1] becomes 100
pre[a-1] += 100;
// pre[4] becomes -100 and this
pre[b] -=100;
// continues m times as we input diff. values of a and b
}
for (let i = 1; i < 5; i++)
{
// add all values in a cumulative way
pre[i] += pre[i - 1];
// keep track of max value
mx = Math.max(mx, pre[i]);
}
return mx;
}
// Driver Code
let m = 3;
let q = [[2,4],[1,3],[1,2]];
// Function call
document.write(find(m,q));
</script>


输出

300

最近关于前缀和技术的文章 本文由 罗希特·塔普里亚尔 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 写极客。组织 或者把你的文章寄去评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享