LeetCode-338: número de bits

Uno, Título Descripción

Aquí Insertar imagen Descripción

En segundo lugar, las ideas de resolución de problemas

  • Violencia: en el modo digital 2 una por una, se obtiene el número 1, cargado vector, la complejidad de tiempo es la ( norte × s yo de mi la F ( yo norte t ) ) O (n \ veces sizeof (int))
  • algoritmos de bits
    • >>Francia
      • Para una representación digital, binario, tal como 9se puede expresar como1001
      • El de la izquierda, llegar 100, y 100este es el resultado debemos calculada antes debido a (n >> 1) < nla creación constante
      • Pero al final depende del bit menos significativo no es 1, a continuación, utilizando n & 1el método, si el bit menos significativo es 0, esta fórmula es igual a cero, de lo contrario 1
      • Obtener la ecuación de transición de estado:dp[i] = dp[i >> 1] + (i & 1)
      class Solution {
      public:
          vector<int> countBits(int num) {
              
              vector<int> res(num + 1, 0);
              for(int i = 1; i <= num; i++)
                  res[i] = res[i >> 1] + (i & 1);
              return res;
          }
      };
      
    • &Francia
      • n & (n - 1)Se puede extraer nde bits más baja 1 (si el bit menos significativo es 1)
      • n - 1El resultado antes de que nos dimos cuenta quedp[i] = dp[i & (i - 1)] + 1
      class Solution {
      public:
          vector<int> countBits(int num) {
      	vector<int> res(num + 1, 0);
          for(int i = 1; i <= num; i++)
              res[i] = res[i & (i - 1)] + 1;
          return res;
       }
      };
      
  • Digital Round-Robin
    • 0:0
    • 1:1
    • 2~3:1,2
    • 4~7:1,2,2,3
    • 8~15:1,2,2,3,2,3,3,4
    • 16~31:1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5
    • Lo que la ley les resulta?
      • Después de cada línea de la línea de los datos adicionales, todo en una línea de datos en la segunda mitad, más la mitad de la segunda media después de recibir la última fila de datos, la segunda mitad de la segunda media después de la media. . . . . . . . . Hasta el final, y por último añadir el último (es decir, el bit máxima) que en una fila de datos es todavía un gran número de 1
      • Después del descubrimiento de esta ley, podemos derribar toda la situación desde el principio del 1
class Solution {
public:
    vector<int> countBits(int num) {
        vector<int> sln;
        sln.push_back(0);
        if(!num)    return sln;
        int start = 0;
        int end = 0;
        int biggest = 0;
        int counter = 0;
        while(1){
            auto len = sln.size();
            start = len / 2;
            end = len - 1;
            bool flag = 0;
            while(start <= end){
                for(int i = start; i <= end; i++){
                    if(sln[start]){
                        sln.push_back(sln[i]);
                        counter++;
                        if(counter == num){
                            return sln;
                        }
                    }
                }
                if(start == end)    break;
                start = (start + end + 1) >> 1;
                
            }
            sln.push_back(++biggest);
            counter++;
            if(counter == num)
                return sln;
        }
        return sln;
};

En tercer lugar, los resultados de explotación

uso de la memoria son similares, la velocidad del operador anfitrión que darse prisa, pero que es presentado por el primer dato de round-robin, el más lento Es decir, se pierde. . . . .
Aquí Insertar imagen Descripción

Publicado 30 artículos originales · ganado elogios 3 · Vistas 817

Supongo que te gusta

Origin blog.csdn.net/weixin_44587168/article/details/105325416
Recomendado
Clasificación