303. Área y matriz de detección inmutables

Tema:
Dada una matriz de números enteros, encuentre la suma de los elementos en el rango del índice i al j (i ≤ j), incluidos dos puntos i y j.
Implemente la clase NumArray:
NumArray (int [] nums) Use la matriz nums para inicializar el objeto
int sumRange (int i, int j) Devuelva la suma de los elementos en la matriz nums del índice i al j (i ≤ j), incluyendo i y j (es decir, sum (nums [i], nums [i + 1],…, nums [j]))

示例 :
输入 :
[“NumArray”, “sumRange”, “sumRange”, “sumRange”]
[[[-2, 0, 3, -5, 2, -1]], [0, 2], [2, 5], [0, 5]]
输出 :
[nulo, 1, -1, -3]
解释 :
NumArray numArray = new NumArray ([- 2, 0, 3, -5, 2, -1]);
numArray.sumRange (0, 2); // devuelve 1 ((-2) + 0 + 3)
numArray.sumRange (2, 5); // return -1 (3 + (-5) + 2 + (-1))
numArray.sumRange (0, 5); // devuelve -3 ((-2) + 0 + 3 + (-5) + 2 + (-1))

Consejo:
0 <= nums.length <= 104-105 <=
nums [i] <= 105
0 <= i <= j <nums.length
puede llamar al método sumRange hasta 104 veces

Enlace de asunto:
https://leetcode-cn.com/problems/range-sum-query-immutable

Ideas para resolver problemas:
preSum (suma de prefijo)
El tema de hoy nos permite encontrar la suma en un intervalo [i, j]. La suma del intervalo se puede hacer con preSum.
El método preSum puede calcular rápidamente la suma de los elementos en el intervalo especificado i-j. Su método de cálculo es atravesar la matriz de izquierda a derecha. Al atravesar la posición i de la matriz, preSum representa la suma de los elementos a la izquierda de la posición i.
Suponiendo que la longitud de la matriz es N, definimos una matriz preSum con una longitud de N + 1, preSum [i] representa la suma de todos los elementos en el lado izquierdo del elemento (sin incluir el elemento i). Luego, recorra la matriz una vez y acumule los elementos en el rango [0, i) para obtener la matriz preSum.

El código de preSum es el siguiente:

Pitón

N = len (nums)
preSum = rango (N + 1)
para i en rango (N):
preSum [i + 1] = preSum [i] + nums [i]
print (preSum)
usa la matriz preSum, que puede ser usado en O (1) Encuentre rápidamente la suma de los elementos en cualquier intervalo [i, j] (ambos extremos inclusive) de nums dentro del tiempo.

suma (i, j) = preSum [j + 1] - preSum [i]

Para esta pregunta, puede encontrar el preSum de cada posición de la matriz en el constructor de la clase NumArray; al calcular sumRange (i, j), devuelva directamente preSum [j + 1] -preSum [i] para obtener la suma del intervalo .

A continuación se toma la matriz [1, 12, -5, -6, 50, 3] como ejemplo para mostrar la suma previa calculada.
Inserte la descripción de la imagen aquí
La idea de resolver el problema se cita en: https://leetcode-cn.com/problems/range-sum-query-immutable/solution/presum-qian-zhui-he-xiang-xi-jiang-jie- b-nh23 /

Código:

class NumArray:

    def __init__(self, nums):
        n = len(nums)
        self.preNums = [0] * (n+1)
        for i in range(n):
            self.preNums[i+1] = self.preNums[i] + nums[i]

    def sumRange(self, i, j):
        return self.preNums[j+1] - self.preNums[i]

s = NumArray([2,4,1,5,3])
print(s.sumRange(2,4))

Supongo que te gusta

Origin blog.csdn.net/annlin2009/article/details/114261307
Recomendado
Clasificación