LeetCode-995. Número mínimo de K volteos de bits consecutivos (Número mínimo de K volteos de bits consecutivos) [Dificultad] -Análisis y código (Java)

LeetCode-995. Número mínimo de K volteos de bits consecutivos [Número mínimo de K volteos de bits consecutivos] [Dificultad] -Análisis y código [Java]

1. Tema

En la matriz A que contiene solo 0 y 1, un cambio de bit K implica seleccionar una submatriz (contigua) de longitud K, y cambiar cada 0 en la submatriz a 1 y cambiar cada 1 a 0.
Devuelve el número mínimo de volteos de K bits necesarios para que la matriz no tenga elementos con valor 0. Si no es posible, devuelve -1.

Ejemplo 1:

输入:A = [0,1,0], K = 1
输出:2
解释:先翻转 A[0],然后翻转 A[2]。

Ejemplo 2:

输入:A = [1,1,0], K = 2
输出:-1
解释:无论我们怎样翻转大小为 2 的子数组,我们都不能使数组变为 [1,1,1]。

Ejemplo 3:

输入:A = [0,0,0,1,0,1,1,0], K = 3
输出:3
解释:
翻转 A[0],A[1],A[2]: A变成 [1,1,1,1,0,1,1,0]
翻转 A[4],A[5],A[6]: A变成 [1,1,1,1,1,0,0,0]
翻转 A[5],A[6],A[7]: A变成 [1,1,1,1,1,1,1,1]

inmediato:

  • 1 <= A. longitud <= 30000
  • 1 <= K <= A. longitud

Fuente: LeetCode
Enlace: https://leetcode-cn.com/problems/minimum-number-of-k-consecutive-bit-flips Los
derechos de autor son propiedad de LeetCode . Para reimpresiones comerciales, comuníquese con la autorización oficial. Para reimpresiones no comerciales, indique la fuente.

Dos, análisis y código

1. Ventana corredera

(1) Pensando

Según el significado de la pregunta, para cada intervalo, solo un giro es válido y la segunda vez volverá al estado inicial. Entonces, puede comenzar desde el principio de la matriz, si el primer elemento es 0, luego invierta el intervalo; de lo contrario, la ventana se moverá hacia la derecha hasta el final.
Si se invierten todos los intervalos, todavía hay 0 en los últimos K elementos, lo que indica que es imposible darse cuenta de que los elementos de la matriz son todos 1.
Para reducir la complejidad, se puede diseñar un número de volteos para registrar el número de volteos que se han realizado en la posición actual. Al voltear, marque la posición actual + K sincrónicamente y luego establezca el número de volteos en -1 cuando atravesando allí.
Debido a que la matriz dada en la pregunta solo contiene 0 y 1, puede cambiar el límite derecho del intervalo marcando el número + 2.

(2) Código

class Solution {
    
    
    public int minKBitFlips(int[] A, int K) {
    
    
        int n = A.length, ans = 0, flip = 0;//翻转次数
        for (int i = 0; i < n; i++) {
    
    
            flip -= A[i] >> 1;
            if (((A[i] + flip) & 1) != 1) {
    
    //目前翻转下当前位置为1无需操作
                if (i > n - K)//最后长度小于K的区间内仍有0,无法全部更改为1
                    return -1;
                if (i + K < n)//翻转了长度为K的区间,到达区间末尾后翻转次数-1
                    A[i + K] -= 2;//通过对2取模避免干扰原数组中的0和1
                flip++;//当前位置开始执行一次翻转
                ans++;//记录翻转次数
            }
        }
        return ans;
    }
}

(3) Resultados

Tiempo de ejecución: 4 ms, superando al 100,00% de los usuarios
en todas las presentaciones de Java ; consumo de memoria: 46,7 MB, superando al 25,63% de los usuarios en todas las presentaciones de Java.

Tres, otro

Nada.

Supongo que te gusta

Origin blog.csdn.net/zml66666/article/details/114043155
Recomendado
Clasificación