338. recuento de bits
Dado un num número entero no negativo. Para 0 ≤ i ≤ i, cada rango num digital, que calcula el número de dígitos binarios 1 y vuelve como una matriz.
Ejemplo 1:
Entrada: 2
de salida: [0,1,1]
Ejemplo 2:
Entrada: 5
Salida: [0,1,1,2,1,2]
avanzada:
Dada la complejidad de tiempo es O (n * sizeof (entero) ) responde muy fácil. Pero se puede en el tiempo lineal O (n) con un pase hacerlo?
Los requisitos de espacio de la complejidad del algoritmo es O (n).
Puede mejorar aún más la solución que? Solicitud no utiliza ningún tipo (por ejemplo, en __builtin_popcount C ++) en C ++ o cualquier otro lenguaje de funciones integradas para hacer esto.
El PS:
i y (i - 1) puede ser eliminado más a la derecha i a 1 (si los hay), y por lo tanto i y (i - 1) es menor que i, y i y (i - 1) tiene una serie de delante contó, por lo que el número i es uno de i y (i - 1) número 1 más 1
class Solution {
public int[] countBits(int num) {
int[] res = new int[num + 1];
for(int i = 1;i<= num;i++){ //注意要从1开始,0不满足
res[i] = res[i & (i - 1)] + 1;
}
return res;
}
}