[LC]191.位1的个数
题目
分析
逐位数
这题比较简单,直接看代码
1 |
|
时间复杂度:$O(logn).$
空间复杂度:$O(1).$
优化
有两种优化方式
$n & (n - 1)$. 通过这个式子,可以将$n$的最低的1置0.
证明: 对于任意$n = a_la_{l-1}…a_k100…00,n-1=a_la_{l-1}…a_k000…00$,
则$n&(n-1) = a_la_{l-1}…a{k}000…00$.即最低的1置0.
$n&(-n)$.通过这个式子,可以取得$n$的最低的1的值.
证明:对于任意$n=a_la_{l-1}…a_k100…00,$
$-n = \overline{a_la_{l-1}…a_k}011…11 + 1 $
$= \overline{a_la_{l-1}…a_k}100…00$
所以$n&(-n)$等于$n$的最低的1的值.
通过上面两个式子,我们可以对算法进行优化,使得我们算法循环的次数严格的等于$n$中1的个数。
代码
1 |
|
时间复杂度:$O(logn).$
空间复杂度:$O(1).$
[LC]191.位1的个数
https://erlsrnby04.github.io/2024/10/06/LC-191-位1的个数/