前缀和

一维前缀和

模版题

package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
    "strings"
)

func main() {
    var reader = bufio.NewReader(os.Stdin)
    var x = readArray(reader)
    //var n, m = x[0], x[1]
    var nums = readArray(reader)
    var sums = make([]int, x[0]+1)
    for i := 0; i < x[0]; i++ {
        sums[i+1] = sums[i] + nums[i]
    }

    var cnt int
    var xx []int
    for cnt < x[1] {
        xx = readArray(reader)
        // 请注意题目下标是从1开始的
        fmt.Println(sums[xx[1]] - sums[xx[0]-1])
        cnt++
    }
}

func readLine(reader *bufio.Reader) string {
    var line, _ = reader.ReadString('\n')
    return strings.TrimRight(line, "\n")
}

func readInt(reader *bufio.Reader) int {
    var num, _ = strconv.Atoi(readLine(reader))
    return num
}

func readArray(reader *bufio.Reader) []int {
    var line = readLine(reader)
    var strList = strings.Split(line, " ")
    var nums = make([]int, 0)
    var err error
    var v int
    for i := 0; i < len(strList); i++ {
        if v, err = strconv.Atoi(strList[i]); err != nil {
            continue
        }
        nums = append(nums, v)
    }
    return nums
}

func nums2string(x []int, sep string) string {
    var b strings.Builder
    for i := 0; i < len(x); i++ {
        b.WriteString(strconv.Itoa(x[i]))
        b.WriteString(sep)
    }
    return b.String()
}

/*
输入一个长度为n的整数序列。

接下来再输入m个询问,每个询问输入一对l, r。

对于每个询问,输出原序列中从第l个数到第r个数的和。

输入格式
第一行包含两个整数n和m。

第二行包含n个整数,表示整数数列。

接下来m行,每行包含两个整数l和r,表示一个询问的区间范围。

输出格式
共m行,每行输出一个询问的结果。

数据范围
1≤l≤r≤n,
1≤n,m≤100000,
−1000≤数列中元素的值≤1000
输入样例:
5 3
2 1 3 6 4
1 2
1 3
2 4
输出样例:
3
6
10
*/

查找数组和

和为K的子数组

Python3

二维前缀和

imgimg

S[i,j]即为左图红框中所有数的的和为S[i,j]=S[i,j−1]+S[i−1,j]−S[i−1,j−1]+a[i,j] (x1,y1),(x2,y2)这一子矩阵中的所有数之和为S[x2,y2]−S[x1−1,y2]−S[x2,y1−1]+S[x1−1,y1−1]

模版题

统计全为1的正方形子矩阵

Python3(超时)

Golang

最后更新于

这有帮助吗?