Uno, Título 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 - algoritmos de bits
>>
Francia- Para una representación digital, binario, tal como
9
se puede expresar como1001
- El de la izquierda, llegar
100
, y100
este es el resultado debemos calculada antes debido a(n >> 1) < n
la creación constante - Pero al final depende del bit menos significativo no es 1, a continuación, utilizando
n & 1
el 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; } };
- Para una representación digital, binario, tal como
&
Francian & (n - 1)
Se puede extraern
de bits más baja 1 (si el bit menos significativo es 1)n - 1
El 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. . . . .