首页 > 其他分享 >前缀和

前缀和

时间:2022-11-16 21:57:52浏览次数:66  
标签:前缀 nums int self sums prefix preSum

目录

简介

求区间和,一般的思路都是利用前缀和的思想。

应用

应用1:Leetcode.303

题目

303.区域和检索 - 数组不可变

分析

题目就可以转换为已知数组 \(nums\) ,先求前缀和 \(preSum\) ,然后再求区间和:

\(diff = preSum[right] - preSum[left -1]\)

代码实现

class NumArray:
    def __init__(self, nums: List[int]):
        self.prefix_sums = [0 for _ in range(len(nums))]
        self.prefix_sums[0] = nums[0]
        for i in range(1, len(nums)):
            self.prefix_sums[i] = self.prefix_sums[i - 1] + nums[i]

    def sumRange(self, left: int, right: int) -> int:
        start = self.prefix_sums[left - 1] if left > 0 else 0
        return self.prefix_sums[right] - start

应用2:Leetcode.523

题目

523. 连续的子数组和

分析

设 \(preSum[i]\) 是数组 \(nums\) 的前缀和。

根据题目的条件,就可以转换为,求满足\((preSum[i] - preSum[j])\ \%\ k\ =\ 0\) 的 \((i,\ j)\) 共有多少对。

根据同余定理,若 \((preSum[i] - preSum[j])\ \%\ k\ =\ 0\) ,那么一定有:

\(preSum[i]\ \%\ k\ =\ preSum[j]\ \%\ k\)

所以,我们只需要遍历每一个前缀和,将其与 \(k\) 取模,然后看是否有相同的模,同时判断序号差值大于 \(2\) 就行了。

注意:题目中条件,\(0\) 也是 \(k\) 的倍数,所以,先提前将 \(0\) 也作为模值 \(-1\) 保存下来。

代码实现

class Solution:
    def getModifiedArray(self, length: int, updates: List[List[int]]) -> List[int]:
        diff = [0 for _ in range(length)]
        for update in updates:
            start, end = update[0], update[1]
            diff[start] += update[2]
            if end + 1 < length:
                diff[end + 1] -= update[2]

        result = [0 for _ in range(length)]
        result[0] = diff[0]
        for i in range(1, length):
            result[i] = result[i - 1] + diff[i]

        return result

标签:前缀,nums,int,self,sums,prefix,preSum
From: https://www.cnblogs.com/larry1024/p/16897627.html

相关文章

  • MySQL 索引最左前缀原则失效?
    测试索引最左前缀原则,发现缺失带头索引后,索引还是生效的。一、测试创建测试表CREATETABLE`user`(`id`bigint(20)NOTNULLAUTO_INCREMENTCOMMENT'主键',......
  • Counting Rectangles(二维数组前缀和)
    题目链接题目描述:Youhave\(n\)rectangles,the\(i\)-threctanglehasheight\(h_i\)andwidth\(w_i\).Youareasked\(q\)queriesoftheform\(h_sw_sh_b......
  • 什么是索引的最左前缀法则
    最左前缀法则:如果索引有多列,如:联合索引,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列,否则将用不到索引。EXPLAINSELECT*FROMemployeesWH......
  • 二维前缀和
    ```#include<bits/stdc++.h>usingnamespacestd;intn,m,K,cnt;inta[510][510],f[510][510];intmain(){ cin>>n>>m>>K; for(inti=1;i<=n;i++) { for(intj=1;j<=m;j+......
  • #yyds干货盘点# 动态规划专题:二维前缀和
    1.简述:描述给你一个n行m列的矩阵A,下标从1开始。接下来有q次查询,每次查询输入4个参数x1,y1,x2,y2请输出以(x1,y1)为左上角,(x2,y2)为右下角的子矩阵......
  • 能力提升综合题单-模拟,前缀和差分 题解
    好久没有写题解了,今天回来了!!A-铺地毯在luogu,享受coding的快乐见到题以后,一道水题直接模拟二位数组。。。《真·ACcode》:点击查看代码#include<bits/stdc++.h>u......
  • 十六进制和八进制的前缀
    1、八进制数是一种逢八进一的计数体制,基数是8,用0~7表示,如077。2、八进制数以数字0开头。3、十六进制数是一种逢十六进一的计数体制,基数是16,用09,AF表示,如0xFF或0XFF。4、十......
  • #yyds干货盘点# 动态规划专题:前缀和
    1.简述:描述给定一个长度为n的数组.接下来有q次查询,每次查询有两个参数l,r.对于每个询问,请输出输入描述:第一行包含两个整数n和q.第二行包含n个整数,表示.接下来q行,每......
  • 208.实现Trie(前缀树)
    Trie(发音类似"try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。请你实现Tri......
  • 每周一脚本:批量对多个文件增加前缀
    最近从设计师那里get了超多的图,结果都是1.png,2.png这样的文件名,自己还需要将这些文件变成可读的文件名,不想一个一个得修改,于是就写了一个简单的脚本,实现批量对多个文件增加......