前缀和详解

目录

  • 前缀和概念
  • 前缀和代码
  • 前缀和例题
    • 题目介绍
    • 思路分析
    • 相关代码
  • 总结

前缀和概念

前缀和:顾名思义,是要求前缀的总和,什么是前缀,对于一个存放数字的数组而言,前缀就是指的数组的前k项,因此对应的前缀和就是数组前k项的和。前缀和一般用来求数组中连续段子数组的值的和,类似于等差数列中利用等差数列的和来求某一段子数列的和:在这里插入图片描述

前缀和代码

public int[] prefix(int[] arr){
        int[] prefixArr = new int[arr.length];
        //前缀和的第一项与数组的第一项相同
        prefixArr[0] = arr[0];
        for(int i = 1; i < arr.length;i++){
        	//从第二项开始,之后每一项都等于前一项加上对应数组项
            prefixArr[i] = prefixArr[i-1] + arr[i];
        }
        return prefixArr;
    }

前缀和例题

题目介绍

前缀和详解_第1张图片在这里插入图片描述

思路分析

  1. 当我们刚看到这道题时,直接想到的方法就是将这个数组的乘积求出来,然后遍历该数组,新数组的每一项都等于原数组的乘积除以该项的值即可。但奈何力扣不作美,偏偏在题目下方给你"摁下回车键":不能使用除法。因此,我们不用这种人人都能想到的方法,当然,这种方法也可以使用,但在使用的时候要注意当某一项的元素为0时,用除法进行运算会出现错误,因此要特别考虑。
  2. 我们利用前缀和的思想来解决这道题:从题目的说明中我们可以看到,我们需要在遍历一次数组的情况下来求解出新数组的每一项元素,当然对于准备工作中的遍历不再考虑范围之内。
  3. 通过分析可以看到,新数组当中的每一项元素都等于原数组中对应位置的前面所有元素的乘积与后面元素所有乘积的乘积。因此我们可以先求出前缀积和后缀积。通过观察我们可以发现新数组的每一项都等于原数组对应位置的前一项的前缀积和后一项的后缀积的乘积对于首尾元素而言,他们分别没有前一项和后一项,如图所示:前缀和详解_第2张图片

相关代码

public int[] productExceptSelf(int[] nums) {
        int len = nums.length;
        //新的数组
        int[] output = new int[len];
        //前缀积数组
        int[] cn = new int[len];
        //后缀积数组
        int[] bn = new int[len];
        cn[0] = nums[0];
        bn[0] = nums[len - 1];
        for (int i = 1; i < len - 1; i++) {
        	//求前缀积和后缀积数组
            cn[i] = nums[i] * cn[i - 1];
            bn[i] = nums[len - 1 - i] * bn[i - 1];
        }
        //新数组的第一项和最后一项单独考虑
        output[0] = bn[len - 2];
        output[len - 1] = cn[len - 2];
        for (int i = 1; i < len - 1; i++) {
        	//新数组的中间的每一项的计算
            output[i] = cn[i - 1] * bn[len - 2 - i];
        }
        return output;

总结

本文主要介绍了一维前缀和的概念以及相关应用。当然也存在高维前缀和,但大致思路都是相同的。前缀和是一种有效的减少时间复杂度的预处理方式,在对大数据进行预处理时能够显著提升预处理的效率

你可能感兴趣的:(数据结构与算法,算法,leetcode,java)