【算法】【前缀和】 算法详解及实现(python、go、java)

目录

一、前缀和的基本概念

二、前缀和的应用场景

三、代码实现

1. Python 实现

2. Go 实现

3. Java 实现


前缀和是一种常用的算法技术,常用于解决区间求和问题。它通过计算数组的前缀和,使得后续的区间求和操作变得更加高效。前缀和的核心思想是将原数组中的元素累加起来,从而在求某个区间和时,只需要通过简单的减法即可快速得到结果。

一、前缀和的基本概念

给定一个数组 nums,前缀和数组 prefix_sum 定义为:

  • prefix_sum[i] = nums[0] + nums[1] + ... + nums[i]

通过前缀和,我们可以在 O(1) 的时间复杂度内计算任意区间 [i, j] 的和:

  • sum(i, j) = prefix_sum[j] - prefix_sum[i - 1](注意处理边界情况)

二、前缀和的应用场景

  • 快速计算数组的任意子数组和
  • 处理与区间相关的查询问题
  • 解决动态更新的问题

三、代码实现

我们将通过一个例子来演示如何使用前缀和来解决子数组和的问题。在这个例子中,我们将实现一个功能来计算给定区间内的和。

1. Python 实现

问题描述:给定一个整数数组 nums 和两个整数 leftright,求出 nums[left]nums[right] 的和。

def calculate_prefix_sum(nums):
    # 初始化前缀和数组,长度为 len(nums) + 1
    prefix_sum = [0] * (len(nums) + 1)
    
    # 计算前缀和
    for i in range(len(nums)):
        prefix_sum[i + 1] = prefix_sum[i] + nums[i]
    
    return prefix_sum

def range_sum(prefix_sum, left, right):
    # 计算区间和
    return prefix_sum[right + 1] - prefix_sum[left]

# 示例
nums = [1, 2, 3, 4, 5]
prefix_sum = calculate_prefix_sum(nums)
left, right = 1, 3  # 计算从索引 1 到 3 的和
result = range_sum(prefix_sum, left, right)
print(f"区间和: {result}")  # 输出: 区间和: 9
  • calculate_prefix_sum 函数计算并返回前缀和数组。
  • range_sum 函数通过前缀和数组快速计算区间和。

2. Go 实现

问题描述:同样的,给定一个整数数组 nums 和两个整数 leftright,求出 nums[left]nums[right] 的和。

package main

import (
    "fmt"
)

func calculatePrefixSum(nums []int) []int {
    // 初始化前缀和数组
    prefixSum := make([]int, len(nums)+1)

    // 计算前缀和
    for i := 0; i < len(nums); i++ {
        prefixSum[i+1] = prefixSum[i] + nums[i]
    }

    return prefixSum
}

func rangeSum(prefixSum []int, left int, right int) int {
    // 计算区间和
    return prefixSum[right+1] - prefixSum[left]
}

func main() {
    nums := []int{1, 2, 3, 4, 5}
    prefixSum := calculatePrefixSum(nums)
    left, right := 1, 3  // 计算从索引 1 到 3 的和
    result := rangeSum(prefixSum, left, right)
    fmt.Printf("区间和: %d\n", result)  // 输出: 区间和: 9
}
  • calculatePrefixSum 函数创建前缀和数组并进行填充。
  • rangeSum 函数利用前缀和数组计算指定区间的和。

3. Java 实现

问题描述:给定一个整数数组 nums 和两个整数 leftright,求出 nums[left]nums[right] 的和。

import java.util.Arrays;

public class PrefixSum {
    public static int[] calculatePrefixSum(int[] nums) {
        // 初始化前缀和数组
        int[] prefixSum = new int[nums.length + 1];

        // 计算前缀和
        for (int i = 0; i < nums.length; i++) {
            prefixSum[i + 1] = prefixSum[i] + nums[i];
        }

        return prefixSum;
    }

    public static int rangeSum(int[] prefixSum, int left, int right) {
        // 计算区间和
        return prefixSum[right + 1] - prefixSum[left];
    }

    public static void main(String[] args) {
        int[] nums = {1, 2, 3, 4, 5};
        int[] prefixSum = calculatePrefixSum(nums);
        int left = 1, right = 3;  // 计算从索引 1 到 3 的和
        int result = rangeSum(prefixSum, left, right);
        System.out.println("区间和: " + result);  // 输出: 区间和: 9
    }
}
  • calculatePrefixSum 方法计算前缀和并返回数组。
  • rangeSum 方法通过前缀和数组快速获取区间和。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值