后缀和数组
后缀和数组给定一个大小为N的数组arr[] ,任务是计算并返回其后缀和数组。
Suffix Sum is a precomputation technique in which the sum of all the elements of the original array from an index i till the end of the array is computed.
Therefore, this suffix sum array will be created using the relation:
例子:
Input: arr[] = { 15, 10, 25, 5, 10, 20 } , N = 6
Output: suffixSum[] = { 85, 70, 60, 35, 30, 20}
Explanation: While traversing the array from back, keep adding element from the back with element at current index.
suffixSum[5] = 20,
suffixSum[4] =suffixSum[5] + arr[4] = 20+10 = 30 ,
suffixSum[3] = suffixSum[4] + arr[3] = 30+5 = 35 and so on.
Input: arr[] = {10, 14, 16, 20}, n = 6
Output: suffixSum[] = {60, 50, 36, 20}
Explanation: suffixSum[3] = 20,
suffixSum[2] =suffixSum[3] + arr[2] = 20+16 = 36 ,
suffixSum[1] = suffixSum[2] + arr[1] = 36+14 = 40 and so on.
方法:要填充后缀和数组,我们将索引 N-1 运行到 0,并继续将当前元素与后缀和数组中的前一个值相加。
- 创建一个大小为 N 的数组来存储后缀和。
- 用原始数组的最后一个元素初始化后缀和数组的最后一个元素
suffixSum[n-1] = arr[n-1] - 从N-2遍历原始数组到0
- 对于每个索引,我找到后缀总和并将其存储在 suffixSum[i]
- suffixSum[i] = suffixSum[i + 1] + arr[i]
- 返回计算的后缀和数组。
下面是上述方法创建后缀和数组的实现:
C++
// C++ program for Implementing
// suffix sum array
#include
using namespace std;
// Function to create suffix sum array
vector createSuffixSum(vector arr, int n)
{
// Create an array to store the suffix sum
vector suffixSum(n, 0);
// Initialize the last element of
// suffix sum array with last element
// of original array
suffixSum[n - 1] = arr[n - 1];
// Traverse the array from n-2 to 0
for (int i = n - 2; i >= 0; i--)
// Adding current element
// with previous element from back
suffixSum[i] = suffixSum[i + 1] + arr[i];
// Return the computed suffixSum array
return suffixSum;
}
// Driver Code
int main()
{
vector arr = { 10, 14, 16, 20 };
int N = arr.size();
// Function call to fill suffix sum array
vector suffixSum = createSuffixSum(arr, N);
// Printing the computed suffix sum array
cout << "Suffix sum array: ";
for (int i = 0; i < N; i++)
cout << suffixSum[i] << " ";
}
Java
// Java program for Implementing
// suffix sum array
import java.util.*;
public class GFG {
// Function to create suffix sum array
static int[] createSuffixSum(int[] arr, int n)
{
// Create an array to store the suffix sum
int[] suffixSum = new int[n];
for (int i = 0; i < n; i++) {
suffixSum[i] = 0;
}
// Initialize the last element of
// suffix sum array with last element
// of original array
suffixSum[n - 1] = arr[n - 1];
// Traverse the array from n-2 to 0
for (int i = n - 2; i >= 0; i--)
// Adding current element
// with previous element from back
suffixSum[i] = suffixSum[i + 1] + arr[i];
// Return the computed suffixSum array
return suffixSum;
}
// Driver Code
public static void main(String args[])
{
int[] arr = { 10, 14, 16, 20 };
int N = arr.length;
// Function call to fill suffix sum array
int[] suffixSum = createSuffixSum(arr, N);
// Printing the computed suffix sum array
System.out.print("Suffix sum array: ");
for (int i = 0; i < N; i++)
System.out.print(suffixSum[i] + " ");
}
}
// This code is contributed by Samim Hossain Mondal.
Python3
# python3 program for Implementing
# suffix sum array
# Function to create suffix sum array
def createSuffixSum(arr, n):
# Create an array to store the suffix sum
suffixSum = [0 for _ in range(n)]
# Initialize the last element of
# suffix sum array with last element
# of original array
suffixSum[n - 1] = arr[n - 1]
# Traverse the array from n-2 to 0
for i in range(n-2, -1, -1):
# Adding current element
# with previous element from back
suffixSum[i] = suffixSum[i + 1] + arr[i]
# Return the computed suffixSum array
return suffixSum
# Driver Code
if __name__ == "__main__":
arr = [10, 14, 16, 20]
N = len(arr)
# Function call to fill suffix sum array
suffixSum = createSuffixSum(arr, N)
# Printing the computed suffix sum array
print("Suffix sum array: ", end="")
for i in range(0, N):
print(suffixSum[i], end=" ")
# This code is contributed by rakeshsahni
C#
// C# program for Implementing
// suffix sum array
using System;
class GFG {
// Function to create suffix sum array
static int[] createSuffixSum(int[] arr, int n)
{
// Create an array to store the suffix sum
int[] suffixSum = new int[n];
for (int i = 0; i < n; i++) {
suffixSum[i] = 0;
}
// Initialize the last element of
// suffix sum array with last element
// of original array
suffixSum[n - 1] = arr[n - 1];
// Traverse the array from n-2 to 0
for (int i = n - 2; i >= 0; i--)
// Adding current element
// with previous element from back
suffixSum[i] = suffixSum[i + 1] + arr[i];
// Return the computed suffixSum array
return suffixSum;
}
// Driver Code
public static void Main()
{
int[] arr = { 10, 14, 16, 20 };
int N = arr.Length;
// Function call to fill suffix sum array
int[] suffixSum = createSuffixSum(arr, N);
// Printing the computed suffix sum array
Console.Write("Suffix sum array: ");
for (int i = 0; i < N; i++)
Console.Write(suffixSum[i] + " ");
}
}
// This code is contributed by Samim Hossain Mondal.
Javascript
Suffix sum array: 60 50 36 20
时间复杂度:O(N),遍历原始数组计算后缀和。
辅助空间:O(N),存储后缀和数组。