首页 > 其他分享 >前缀和 与 区间

前缀和 与 区间

时间:2023-09-11 22:56:28浏览次数:26  
标签:前缀 nums int res num mp 区间 cur

思想 a ~ b区间可以转换为 0 ~ b - 0 ~ (a - 1)

用这种前缀和的思想,可以快速枚举所有合格条件的自区间。

 

 

 

class Solution:
    def subarraySum(self, nums: List[int], k: int) -> int:
        m = dict()
        m[0] = 1
        cur, res = 0, 0
        for num in nums:
            cur += num
            if cur - k in m:
                res += m[cur - k]
            if cur in m:
                m[cur] += 1
            else:
                m[cur] = 1

        return res

 

 

 

class Solution:
    def subarraysDivByK(self, nums: List[int], k: int) -> int:
        m = dict()
        m[0] = 1

        cur, res = 0, 0
        for num in nums:
            cur = (cur + num) % k
            if cur in m:
                res += m[cur]
            if cur in m:
                m[cur] += 1
            else:
                m[cur] = 1
        
        return res

 

 

 

class Solution:
    def findMaxLength(self, nums: List[int]) -> int:
        n = len(nums)
        for i in range(n):
            if nums[i] == 0:
                nums[i] = -1

        cur, res = 0, 0

        mp = dict()
        mp[0] = -1

        for i, num in enumerate(nums):
            cur += num
            if cur in mp:
                res = max(res, i - mp[cur])
            else:
                mp[cur] = i

        return res

 

标签:前缀,nums,int,res,num,mp,区间,cur
From: https://www.cnblogs.com/zk6696/p/17694790.html

相关文章

  • swift5 区间类型和数组转化
    在Swift5中,你可以使用区间(Range)类型来表示一系列连续的数字,并且可以使用一些内置的函数和方法将区间类型和数组(Array)之间进行转换。首先,我们来了解一下如何创建和使用区间类型。创建区间类型:swiftletrange=1...5//创建一个闭区间,包括1到5letopenRange=1..<5//创建......
  • 前缀和数组
    classPrefixSum{//前缀和数组privateint[]prefix;/*输⼊⼀个数组,构造前缀和/publicPrefixSum(int[]nums){prefix=newint[nums.length+1];//计算nums的累加和for(inti=1;i<prefix.length;i++){prefix[i]=prefix[i-1]+nums[i-1];}}/......
  • 线段树【区间求和】
    #include<bits/stdc++.h>#definemaxn500005usingnamespacestd;intn,m;inta[maxn];structnode{ intl,r,sum;};nodetr[4*maxn];voidbuild(intl,intr,intp){ //对[l,r]区间建立线段树,当前根的编号为p intmid=(l+r)>>1; //intmid=s+((t-s)&g......
  • 6574: 最大数 线段树/单点加/求区间最大值
    描述 给定一个正整数数列a1,a2,a3,⋯,an,每一个数都在0~p–1之间。可以对这列数进行两种操作:添加操作:向序列后添加一个数,序列长度变成n+1;询问操作:询问这个序列中最后L个数中最大的数是多少。程序运行的最开始,整数序列为空。写一个程序,读入操作的序列,并输出询问操作的......
  • 区间合并 (9/3)
    一、区间合并1、用sort排序排vector的pair先排左边再排右边voidmerge(vector<PII>&segs){vector<PII>res;//左端点排序sort(segs.begin(),segs.end());//左右端点初始化,-无穷intstart=-2e9,end=-2e9;for(autoseg:segs){......
  • 前缀树(Trie)的java实现
    前缀树prefixtree,又叫做trie。关键Feature如下:树形结构根节点为空结点包含Node[]nexts;//size26intisEnd;//有多少个字符串以当前字符结尾intpass;//多少个字符串经过了当前字符常用操作insertdeletesearch//字符串在前缀树中出现的次数prefi......
  • 区间dp入门选讲
    目录区间dp入门选讲合并果子括号匹配PalindromeAgainPalindromeStringpainter搬寝室配对区间dp入门选讲合并果子传送门设\(f_{i,j}\)表示合并区间\([i,j]\)的最小代价,\(\begin{aligned}s_i=\sum^{i}_{k=1}a_k\end{aligned}\),显然有\(\begin{aligned}f_{i,j}=\min(f_{......
  • 2023-09-01:用go语言编写。给出两个长度均为n的数组, A = { a1, a2, ... ,an }, B = { b1
    2023-09-01:用go语言编写。给出两个长度均为n的数组,A={a1,a2,...,an},B={b1,b2,...,bn}。你需要求出其有多少个区间[L,R]满足:数组A中下标在[L,R]中的元素之和在[La,Ra]之中,数组B中下标在[L,R]中的元素之和在[Lb,Rb]之中。输入:第一行有一个正整数N(1<=N<=100000),代表两......
  • 2023-09-01:用go语言编写。给出两个长度均为n的数组, A = { a1, a2, ... ,an }, B = { b1
    2023-09-01:用go语言编写。给出两个长度均为n的数组,A={a1,a2,...,an},B={b1,b2,...,bn}。你需要求出其有多少个区间[L,R]满足:数组A中下标在[L,R]中的元素之和在[La,Ra]之中,数组B中下标在[L,R]中的元素之和在[Lb,Rb]之中。输入:第一行有一个正整数N(1<=N<=10000......
  • 挑程:矩阵乘积链(区间dp)
    传送区间dp点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintN=110;intp[N],dp[N][N];voidsolve(){intn;cin>>n;for(inti=1;i<=n;++i)cin>>p[i-1]>>p[i];memset(dp,0x3f,sizeofdp);for(inti......