tema:
992, K submatrices de diferentes enteros
Dada una matriz de enteros positivos A, si el número de enteros diferentes en una submatriz de A resulta ser K, entonces esta submatriz continua, no necesariamente independiente de A, se llama una buena submatriz.
(Por ejemplo, hay 3 números enteros diferentes en [1,2,3,1,2]: 1, 2 y 3.)
Devuelve el número de submatrices buenas en A.
Ejemplo 1:
Entrada: A = [1,2,1,2,3], K = 2
Salida: 7
Explicación: Una submatriz que consta de exactamente 2 números enteros diferentes: [1,2], [2,1], [1, 2], [2,3], [1,2,1], [2,1,2], [1,2,1,2].
Ejemplo 2:
Entrada: A = [1,2,1,3,4], K = 3
Salida: 3
Explicación: Una submatriz que consta de exactamente 3 enteros diferentes: [1,2,1,3], [2,1, 3], [1,3,4].
inmediato:
1 <= A. longitud <= 20000
1 <= A [i] <= A. longitud
1 <= K <= A. longitud
Ideas de solución de problemas:
Podemos hacer la siguiente conversión: El número de submatrices con al menos K enteros diferentes - el número de submatrices con al menos K + 1 enteros diferentes
Resolver subproblemas:
(1) Enumere i, encuentre el número de submatrices que comienzan con i y al menos K enteros diferentes
(2) Si encontramos una j calificada tal que [i, j] es una submatriz que cumple las condiciones, Entonces [ i, j], [i, j + 1], [i, j + 2], ..., [i, n-1] son todas submatrices que cumplen las condiciones.
(3) Después de eso, encogemos la ventana hasta que la matriz en la ventana no cumpla con las condiciones, y luego volvemos a ampliar la ventana y volvemos al paso anterior.
Código Python de la solución del problema:
class Solution:
def subarraysWithKDistinct(self, A: List[int], K: int) -> int:
def helper(A,K):
n = len(A)
i = 0
res = 0
##########################
# 窗口内需要维护的变量
diff_nums = 0
counter = collections.defaultdict(int)
##########################
for j in range(n):
# 扩大窗口
counter[A[j]] += 1
if counter[A[j]] == 1:
diff_nums += 1
# 如果找到以i开头满足条件的子数组了,就更新答案并缩小窗口
while diff_nums > K:
res += n-j
counter[A[i]] -= 1
if counter[A[i]] == 0:
diff_nums -= 1
i += 1
return res
return -helper(A,K) + helper(A,K-1)
Autor: MiloMusiala
enlace: https://leetcode-cn.com/problems/subarrays-with-k-different-integers/solution/python-dong-hua-tong-xiang-shuang-zhi-zh-57ym/
Fuente: force LeetCode (LeetCode) https://leetcode-cn.com/problems/subarrays-with-k-different-integers/
Ideas de soluciones violentas:
Obtenga todas las submatrices de A, determine si sus diferentes enteros son iguales a K mientras obtiene cada submatriz y, finalmente, devuelva el número de submatrices que cumplen las condiciones.
Simple y grosero, pero desafortunadamente fueron horas extras. . .
Se puede utilizar en proyectos reales, solo como referencia.
Código Python de solución violenta:
class Solution:
def subarraysWithKDistinct(self, A: List[int], K: int) -> int:
ans = 0
n = len(A)
# x + 1 表示子串的长度
for x in range(n):
# i 表示滑窗长度
for i in range(x+1,n+1):
# if len(set(A[x:i]))==K:
# ans += 1
if len(set(A[x:i]))==K:
ans += 1
return ans