303. La región y la matriz de búsqueda son inmutables
Dado un número entero de matrices, encuentre la suma de los elementos en la matriz del índice i a j (i ≤ j), incluidos i y j.
Ejemplos:
Dado nums = [-2, 0, 3, -5, 2, -1], la función de suma es sumRange ()
sumRange (0, 2) -> 1
sumRange (2, 5) -> -1
sumRange (0, 5) -> -3
说明:
Puede suponer que la matriz es inmutable.
El método sumRange se llama varias veces.
Código 303
type NumArray struct {
Value []int
}
func Constructor(nums []int) NumArray {
arr := NumArray{[]int{0}} // 浪费第一个空间
// 1, 2, 3, 4, 5
for i, v := range nums {
// 1, 3, 6, 10, 15
arr.Value = append(arr.Value, v + arr.Value[i])
}
return arr
}
func (this *NumArray) SumRange(i int, j int) int {
// i = 0; j = 3
// [3+1] - [0] = 15 - 1 = 14 = 1 + 2 + 3 + 4
return this.Value[j+1] - this.Value[i]
}
560. Suma es un subconjunto de K
Dada una matriz de enteros y un entero k, necesita encontrar el número de submatrices consecutivas en la matriz cuya suma es k.
Ejemplo 1:
Entrada: nums = [1,1,1], k = 2
Salida: 2, [1,1] y [1,1] son dos situaciones diferentes.
Explicación
La longitud de la matriz es [1, 20,000].
El rango de elementos en la matriz es [-1000, 1000], y el rango del entero k es [-1e7, 1e7].
Código 560
func subarraySum(nums []int, k int) int {
res , m , sum := 0, make(map[int]int,0),0
m[0] = 1
for i:=0;i<len(nums);i++{
sum += nums[i]
if _,ok := m[sum-k];ok{
res += m[sum-k]
}
m[sum]++
}
return res
}
1248. Estadísticas "Beautiful Subarrays"
Le da una matriz de números enteros y un número entero k.
Si hay exactamente k números impares en una sub-matriz continua, consideramos que esta sub-matriz es una "sub-matriz elegante".
Devuelva el número de "subarreglos hermosos" en esta matriz.
Ejemplo 1:
Entrada: nums = [1,1,2,1,1], k = 3
Salida: 2
Explicación: Las sub-matrices que contienen 3 números impares son [1,1,2,1] y [1,2,1,1 ]
Ejemplo 2
Entrada: nums = [2,4,6], k = 1
Salida: 0
Explicación: La secuencia no contiene ningún número impar, por lo que no hay una sub-matriz elegante.
Ejemplo 3
Entrada: nums = [2,2,2,1,2,2,1,2,2,2], k = 2
Salida: 16
Consejos:
1 <= nums.length <= 50000
1 <= nums [i] <= 10 ^ 5
1 <= k <= nums.length
Código 1248
¡Esta pregunta es estrictamente una categoría de programación dinámica!
func numberOfSubarrays(nums []int, k int) int {
dp := make([]int, 0)
cnt, ret := 0, 0
for i := 0; i < len(nums); i++ {
cnt++
// 每次遇到奇数。记录他前面的偶数个数
if nums[i]%2 == 1 {
dp = append(dp, cnt)
cnt = 0
}
if len(dp) >= k {
ret += dp[len(dp) - k]
}
}
return ret
}